这是我正在使用的数据框:
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,还是有更简单的方法来做到这一点?
答案 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])))