【问题标题】:How to factorize specific columns in a data.frame in R using apply如何使用apply分解R中data.frame中的特定列
【发布时间】:2011-12-20 05:39:02
【问题描述】:

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

for(i in ids) mydata[, i]<-as.factor(mydata[, i])

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

mydata[, ids]<-apply(mydata[, ids], 2, as.factor)

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

亲切的问候, 迈克尔

【问题讨论】:

    标签: r dataframe apply


    【解决方案1】:

    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 将具有相似的性能,但 &lt;-.data.frame 操作非常慢。通过使用lapply,可以避免每次迭代中的&lt;- 操作,并将其替换为单个分配。这要快得多。

    【讨论】:

      【解决方案2】:

      那是因为 apply() 的工作方式完全不同。它将首先在本地环境中执行 as.factor 函数,从中收集结果,然后尝试将它们合并到 array 而不是数据框。在您的情况下,该数组是一个矩阵。 R 遇到不同的因素,除了先将它们转换为字符之外,没有其他方法可以绑定它们。该字符矩阵用于填充您的数据框。

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

      require(plyr)
      Df[,ids] <- colwise(as.factor)(Df[,ids])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-09
        • 2018-12-17
        • 2020-10-29
        • 1970-01-01
        • 1970-01-01
        • 2011-01-30
        • 2021-07-16
        • 1970-01-01
        相关资源
        最近更新 更多