![](/img/trans.png)
[英]How to apply a summarization measure to matching data.frame columns in R
[英]How to factorize specific columns in a data.frame in R using apply
我有一个名为 mydata 的 data.frame 和一个包含 data.frame 中我想转换为因子的列索引的向量 ids。 现在下面的代码解决了这个问题
for(i in ids) mydata[, i]<-as.factor(mydata[, i])
现在我想通过使用 apply 而不是显式的 for 循环来清理这段代码。
mydata[, ids]<-apply(mydata[, ids], 2, as.factor)
但是,最后一条语句给了我一个 data.frame,其中类型是字符而不是因子。 我看不出这两行代码之间的区别。 为什么它们不会产生相同的结果?
亲切的问候,迈克尔
apply
的结果是一个向量或数组或值列表(参见?apply
)。
对于您的问题,您应该使用lapply
代替:
data(iris)
iris[, 2:3] <- lapply(iris[, 2:3], as.factor)
str(iris)
'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : Factor w/ 23 levels "2","2.2","2.3",..: 15 10 12 11 16 19 14 14 9 11 ...
$ Petal.Length: Factor w/ 43 levels "1","1.1","1.2",..: 5 5 4 6 5 8 5 6 5 6 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
请注意,这是lapply
比for
循环快得多的地方。 通常,循环和 lapply 将具有相似的性能,但<-.data.frame
操作非常慢。 通过使用lapply
避免了每次迭代中的<-
操作,并将其替换为单个赋值。 这要快得多。
那是因为 apply() 的工作方式完全不同。 它将首先在本地环境中执行 as.factor 函数,从中收集结果,然后尝试将它们合并到数组而不是数据帧中。 这个数组在你的情况下是一个矩阵。 R 遇到不同的因素,除了先将它们转换为字符外,没有其他方法可以将它们绑定。 该字符矩阵用于填充您的数据框。
您可以为此使用 lapply (请参阅 Andrie 的回答)或 colwise 从 plyr 函数。
require(plyr)
Df[,ids] <- colwise(as.factor)(Df[,ids])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.