【问题标题】:How to run tapply() on multiple columns of data frame using R?如何使用 R 在数据框的多列上运行 tapply()?
【发布时间】:2011-10-25 04:19:48
【问题描述】:

我有一个如下的数据框:

a   b1  b2  b3  b4  b5  b6  b7  b8  b9
D   4   6   9   5   3   9   7   9   8
F   7   3   8   1   3   1   4   4   3
R   2   5   5   1   4   2   3   1   6
D   9   2   1   4   3   3   8   2   5
D   5   4   3   1   6   4   1   8   3
R   3   7   9   1   8   5   3   4   2
D   4   1   8   2   6   3   2   7   5
F   7   1   7   2   7   1   6   2   4
D   6   3   9   3   9   9   7   1   2

tapply(df[,2], INDEX = df$a, sum) 函数可以很好地生成一个表格,该表格将 df[,2] 中的所有内容与 df$a 相加,但是当我尝试tapply(df[,2:10], INDEX = df$a, sum) 获得一个类似的表格时,除了每列的总和(2 , 3, 4,..., 10),我收到一条错误消息:

tapply(df[, 2:10], INDEX = df$a, sum) 中的错误:参数必须具有相同的长度

另外,我希望表的行名是df[,2:10]的列名,这样第1行是b1,第2行是b2,第9行是b9。

【问题讨论】:

    标签: r data-manipulation


    【解决方案1】:

    这是一种将data.table 应用于此问题的方法。

    library(data.table)
    DT <- data.table(df)
    DT[, lapply(.SD, sum), by=a]
    

    这是dplyr 方法

    library(dplyr)
    df %>% group_by(a) %>% summarise_all(funs(sum))
    

    【讨论】:

    • summarise_each() 已弃用。请改用summarise_all()summarise_at()summarise_if()。要将funs 映射到所有变量,请使用summarise_all()
    • lapply 中的 .SD 有什么作用?
    • ".SD 代表类似“Data.table 的子集”。最初的“.”没有任何意义,只是它更不可能与用户发生冲突- 定义的列名。”
    【解决方案2】:

    另一种可能性是结合applytapply

    apply(df[,-1], 2, function(x) tapply(x, df$a, sum))
    

    将产生输出(这是一个矩阵)

        b1  ...   b9
    D   sD1 ...  sD9
    F   sF1 ...  sF9
    R   sR1 ...  sR9
    

    然后您可以使用as.data.frame() 获取数据框作为输出。

    【讨论】:

      【解决方案3】:

      这是因为 tapply 对向量起作用,并将 df[,2:10] 转换为向量。接下来, sum 将为您提供总和,而不是每列的总和。使用aggregate(),例如:

      aggregate(df[,2:10],by=list(df$a), sum)
      

      如果你想返回一个列表,你可以使用 by() 。确保指定 colSums 而不是 sum,因为它适用于拆分的数据帧:

      by(df[,2:10],df$a,FUN=colSums)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-09
        • 2018-12-02
        相关资源
        最近更新 更多