如何使用apply对R中data.frame中的特定列进行分解

Dr.*_*ike 7 r apply dataframe

我有一个名为mydata的data.frame和一个包含data.frame中列的索引的矢量id,我想将其转换为因子.现在,以下代码解决了这个问题

for(i in ids) mydata[, i]<-as.factor(mydata[, i])
Run Code Online (Sandbox Code Playgroud)

现在我想通过使用apply而不是显式的for循环来清理这段代码.

mydata[, ids]<-apply(mydata[, ids], 2, as.factor)
Run Code Online (Sandbox Code Playgroud)

但是,最后一个语句给了我一个data.frame,其中类型是字符而不是因素.我没有看到这两行代码之间的区别.为什么他们不会产生相同的结果?

亲切的问候,迈克尔

And*_*rie 12

结果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 ...
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个lapplyfor循环快得多的地方.通常,循环和lapply将具有类似的性能,但<-.data.frame操作非常慢.通过使用lapply一个避免<-每次迭代中的操作,并用单个赋值替换它.这要快得多.


Jor*_*eys 5

那是因为apply()完全不同.它将首先在本地环境中执行函数as.factor,从中收集结果,然后尝试将它们合并到数组而不是数据帧.在您的情况下,此数组是一个矩阵.R符合不同的因素,除了首先将它们转换为角色之外别无他法.该字符矩阵用于填充您的数据帧.

您可以使用lapply(请参阅Andrie的答案)或plyr函数的colwise.

require(plyr)
Df[,ids] <- colwise(as.factor)(Df[,ids])
Run Code Online (Sandbox Code Playgroud)