【问题标题】:R data.table: mean for many columnsR data.table:多列的平均值
【发布时间】:2017-10-04 02:15:26
【问题描述】:

我想使用R 中的data.table 包来计算另一组列的许多列的列均值。我知道如何为几列执行此操作,我在下面提供了一个示例。但是,在我的非玩具示例中,我有数十个变量要为此执行此操作,并且我想从列名的向量中找到一种方法来执行此操作。这可能吗?

library(data.table)

# creates data table
dfo <- data.frame(bananas = 1:5, 
             melonas = 6:10,
             yeah = 11:15,
             its = c(1,1,1,2,2)
             )
dto <- data.table(dfo)

# gets column means by 'its' column
dto[,
.('bananas_mean' = mean(bananas),
  'melonas_mean' = mean(melonas),
  'yeah_mean' = mean(yeah)
  ),
by = .(its)]

【问题讨论】:

  • 跟进 Frank 的评论,以您想要的方式命名,您只需要稍作修改:cols &lt;- c("bananas", "melonas", "yeah"); dto[,(paste0(cols, "_mean")) := lapply(.SD, mean), by = its, .SDcols = cols]
  • 我认为我的R 可能有问题。我尝试了那个确切的代码,但我没有得到任何输出。知道为什么吗?
  • 它正在更新dto,所以您是否尝试在运行后查看dto
  • 哦,这很有趣。有用!我以前从未见过 R 这样做。

标签: r data.table


【解决方案1】:

使用data.table:

library(data.table)
d <- dto[, lapply(.SD, mean), by=its]

d

   its bananas melonas yeah
1:   1     2.0     7.0 12.0
2:   2     4.5     9.5 14.5

显然,可以使用和组合其他功能。希望能帮助到你。

【讨论】:

    【解决方案2】:

    OP 已要求 从列名的向量中计算许多列的列均值。此外,OP 在他的示例代码中已经证明他想要重命名结果列。

    excepted answerthis comment 中建议的解决方案都不完全满足所有这些要求。接受的答案会计算 data.table 的 all 列的平均值,并且不会重命名结果。 cmets 中的解决方案确实使用列名向量并重命名结果,但修改了原始 data.table 而the OP expects a new object

    使用以下代码可以满足 OP 的要求:

    # define columns to compute mean of
    cols <- c("bananas", "melonas")
    # compute means for selected columns and rename the output
    result <- dto[, lapply(.SD, mean), .SDcols = cols, by = its
                  ][, setnames(.SD, cols, paste(cols, "mean", sep = "_"))]
    
    result
    #   its bananas_mean melonas_mean
    #1:   1          2.0          7.0
    #2:   2          4.5          9.5
    

    仅对作为列名的字符向量给出的列计算平均值,输出列已重命名,并且 dto 不变。

    编辑感谢this commentthis answer, 有一种方法可以让data.table 重命名输出列自动

    result <- dto[, sapply(.SD, function(x) list(mean = mean(x))), .SDcols = cols, by = its]
    result
    #   its bananas.mean melonas.mean
    #1:   1          2.0          7.0
    #2:   2          4.5          9.5
    

    【讨论】:

    • 也可以做f &lt;- function(x) list(mean = mean(x)) ; dto[, sapply(.SD, f), .SDcols = cols] 之类的。或者对于多种功能,它可以概括为f &lt;- function(x) c(mean = mean(x), max = max(x)) ; dto[, sapply(.SD, f), .SDcols = cols] 或类似甚至f &lt;- function(x) list(mean = mean(x), max = max(x)) ; dto[, unlist(lapply(.SD, f)), .SDcols = cols]
    • 取自here btw,可能是本题的骗子目标
    • @DavidArenburg 不幸的是,具有多个功能的通用版本在与分组结合时效果不佳
    • 这是我能想到的最好的f &lt;- function(x, y) list(mean = mean(x), max = max(x)) ; dto[, setDT(do.call(rbind.data.frame, lapply(.SD, f)), keep.rownames = TRUE), .SDcols = cols, by = its]
    猜你喜欢
    • 2019-07-26
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2016-03-11
    • 1970-01-01
    • 2014-08-09
    相关资源
    最近更新 更多