在R中将数据帧转换为数字数据帧

时间:2014-12-07 03:46:48

标签: r dataframe

这是我正在使用的数据框:

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 个答案:

答案 0 :(得分:3)

我们可以通过几种方式实现这一目标。一种方法是将data.frame转换为matrix,然后将match转换为数据集中包含unique元素的方法。即在这种情况下letters[1:4]。但结果将是一个向量。我们可以将dimensions指定为dim,即可将其转换为原始数据集的dim(df)dim<-(..., 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,并将级别指定为数据集的唯一值,然后通过numeric将其转换为as.numeric。这可以使用loop

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