当前位置:  开发笔记 > 程序员 > 正文

如何将因子的数据帧转换为数字?

如何解决《如何将因子的数据帧转换为数字?》经验,为你挑选了3个好方法。

我有一个包含所有因子值的数据框

V1 V2 V3
 a  b  c
 c  b  a
 c  b  c
 b  b  a

如何将数据框中的所有值转换为具有数值的新值(a到1,b到2,c到3等等)



1> A5C1D2H2I1M1..:

我会尝试:

> mydf[] <- as.numeric(factor(as.matrix(mydf)))
> mydf
  V1 V2 V3
1  1  2  3
2  3  2  1
3  3  2  3
4  2  2  1



2> akrun..:

转换factornumeric给出整数值.但是,如果factor列的级别指定为c('b', 'a', 'c', 'd')c('c', 'b', 'a'),则整数值将按此顺序排列.为了避免这种情况,我们可以levels通过factor再次调用来指定(更安全)

df1[] <- lapply(df1, function(x) 
                as.numeric(factor(x, levels=letters[1:3])))

如果我们使用data.table,一种选择是使用set.对于大型数据集,它会更有效.转换为matrix可能会造成内存问题.

library(data.table)
setDT(df1)
for(j in seq_along(df1)){
 set(df1, i=NULL, j=j, 
     value= as.numeric(factor(df1[[j]], levels= letters[1:3])))
 }



3> Rich Scriven..:

这种方法与Ananda相似,但使用的是unlist()代替factor(as.matrix()).由于您的所有列都已经是因子,unlist()因此将它们组合成具有适当级别的一个因子向量.

那么让我们来看看我们unlist()的数据框架会发生什么.

unlist(df, use.names = FALSE)
#  [1] a c c b b b b b c a c a
# Levels: a b c

现在我们可以简单地运行as.integer()(或c())上面的代码,因为因子的整数值与您想要的映射匹配.因此,以下内容将重新评估您的整个数据框架.

df[] <- as.integer(unlist(df, use.names = FALSE))
## note that you can also just drop the factor class with c()
## df[] <- c(unlist(df, use.names = FALSE))
df
#   V1 V2 V3
# 1  1  2  3
# 2  3  2  1
# 3  3  2  3
# 4  2  2  1

注意: use.names = FALSE没有必要.但是,删除names属性将使此过程更有效.

数据:

df <- structure(list(V1 = structure(c(1L, 3L, 3L, 2L), .Label = c("a", 
"b", "c"), class = "factor"), V2 = structure(c(1L, 1L, 1L, 1L
), .Label = "b", class = "factor"), V3 = structure(c(2L, 1L, 
2L, 1L), .Label = c("a", "c"), class = "factor")), .Names = c("V1", 
"V2", "V3"), class = "data.frame", row.names = c(NA, -4L))

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有