2014-12-07 202 views
0

这里的一个数据帧我正在使用:转换一个数据帧为数值数据帧中的R

c1 = c('a', 'b', 'c', 'd') 
c2 = c('d', 'a', 'd', 'c') 
c3 = c('a', 'c', 'd', 'b') 
c4 = c('a', 'c', 'b', 'd') 
df = data.frame(c1, c2, c3, c4) 

c1 c2 c3 c4 
a  d  a  a 
b  a  c  c 
c  d  d  b 
d  c  b  d 

我想使用这种规模转换:A = 1,B = 2,C = 3,d = 4。 所以,我得到这样的:

c1 c2 c3 c4 
    1 4 1 1 
    2 1 3 3 
    3 4 4 2 
    4 3 2 4 

这是我想出了:

for(i in colnames(df)){ 
    df$i = gsub("a", 1, df$i) 
    df$i = gsub("b", 2, df$i) 
    df$i = gsub("c", 3, df$i) 
    df$i = gsub("d", 4, df$i) 
} 

但它不工作。我应该在这里使用gsub,还是有更简单的方法来做到这一点?

+1

类似下面的答案,如果你的关键是不连续的,你可以把你自己的'键<做 - C(“A” =“1”,“B '='2','c'='3','d'='4'); df [] < - key [as.matrix(df)]' – rawr 2014-12-07 04:13:24

回答

3

我们可以通过几种方法做到这一点。一种方法是将data.frame转换为matrix,然后match将数据集中的元素转换为unique。即在这种情况下为letters[1:4]。但结果将是一个向量。我们可以通过将dim指定为dim(df)即,将其转换为原始数据集的相同dimensionsdim<-(..., dim(df)。另请检查here以了解有关任务的更多详情。

df2 <- df 
df2[] <- `dim<-`(match(as.matrix(df), letters[1:4]), dim(df)) 
df2 
# c1 c2 c3 c4 
#1 1 4 1 1 
#2 2 1 3 3 
#3 3 4 4 2 
#4 4 3 2 4 

上面的代码可以被分成单独的行:

v1 <- match(as.matrix(df), letters[1:4]) 
df2[] <- `dim<-`(v1, dim(df)) 

df2[] <- matrix(v1, ncol=ncol(df), row=nrow(df)) 

另一种选择是数据集中列转换为factor指定为数据集的唯一值的电平然后通过as.numeric将其转换为numeric。这可以在使用looplapply

df2[] <-lapply(df, function(x) as.numeric(factor(x, levels=letters[1:4]))) 
+0

真的很不错,和我脑子里想的差不多,但是在一行中这样做有点像炫耀,你不觉得吗? :)分离出来,并解释一点我肯定会不胜感激。 – Aaron 2014-12-07 03:52:17

+0

@Aaron我会分解代码并解释。 – akrun 2014-12-07 03:53:23

+0

@akrun,'dim <-'在这里做什么?这是r的内置函数吗? – 2014-12-07 04:05:06