【问题标题】:Calculating the means of many factor columns in a data frame计算数据框中许多因子列的平均值
【发布时间】:2016-02-03 07:53:49
【问题描述】:

我有因子列的数据帧。这里是一个很小的示例:

dat <- data.frame(one = factor(c("a", "b")), two = factor(c("c", "d")))

我可以计算所依据的因素标签每列的数字值的装置:

mean(as.integer(dat$one))
[1] 1.5

不过,因为有我的数据帧非常多列,我想,以避免计算所有个体手段,宁愿做这样的事情: P>

colMeans(dat)

不工作,因为列因素,或者 P>

colMeans(as.integer(dat))

这也不起作用。 P>

那么,如何可以容易地计算所有因子列的手段,没有一个环或单独计算它们所有吗

我真的要change the class of all columns? P>

【问题讨论】:

  • colMeans(data.matrix(dat))可以工作。跨度>
  • @帕斯卡待办事项str(dat),这将返回三行,其中一个读取:$ one: Factor w/ 2 levels "a","b": 1 2。这告诉你,“A”和“B”仅仅是标签和因素包含数字。通过铸造的因子为数字或整数(我的第二个例子),我可以在这些数字获得。跨度>
  • 谢谢,@DavidArenburg,这是完美的。 SPAN>
  • 你应该提防尽管这种操作。有时底层整数可以相当混乱。 SPAN>
  • 感谢您的提醒,@DavidArenburg,这很容易忘记。在目前的情况下我花了很多心血来正确排序我的标贴,想想羯羊的因素实际上是超过序数型标尺缩放。 SPAN>

标签: r dataframe mean


【解决方案1】:

data.matrix 几乎就是为这样的任务而设计的。它还会跳过numericinteger 列(如果存在),从而减少内存使用量,尽管有时转换为matrix 可能是开销。所以只要你没有character 列,这应该很简单

colMeans(data.matrix(dat))
# one two 
# 1.5 1.5

【讨论】:

    【解决方案2】:

    我们可以使用lapply

    lapply(dat, function(x) mean(as.integer(x)))
    

    dplyr

    library(dplyr)
    dat %>%
      summarise_each(funs(mean(as.integer(.))))
    

    对于大型数据集,最好按每列分别计算mean,因为转换为matrix 也可能会产生内存问题。

    【讨论】:

      【解决方案3】:

      编写一个使用 for 循环将所有值写入向量的简单函数。

      dat <- data.frame(one = c(1:10), two = c(1:10))
      
      colMeans <- function(tablename){
        i <- 1
        colmean <- c(1:ncol(tablename))
      
        for(i in c(1:ncol(tablename))){
          colmean[i] <- mean(tablename[,i])
        }
        return(colmean)
      }
      
      colMeans(dat)
      

      希望这可行

      【讨论】:

      • 仅供参考,已经有一个名为 colMeans 的函数,因此您可能希望给自定义函数起一个不同的名称
      【解决方案4】:

      你也可以使用data.table包,比data.frame更快。如果您的数据很大,例如数百万次观察,而不是您需要 data.table 来优化运行时间。

      下面是代码:

      library(data.table)
      dat <- data.table(one = factor(c("a", "b")), two = factor(c("c", "d")))
      factorCols <- c("one", "two")
      dat[, lapply(.SD, FUN=function(x) mean(as.integer(x))), .SDcols=factorCols]
      

      【讨论】:

        猜你喜欢
        • 2016-03-03
        • 1970-01-01
        • 2016-09-16
        • 1970-01-01
        • 1970-01-01
        • 2017-07-07
        • 2021-12-12
        相关资源
        最近更新 更多