R数据表:多列求平均

18

我希望使用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)]

4
这个链接是指向 Stack Overflow 网站上的一个问题,编号为 16846380。 - Frank
1
针对Frank的评论,为了使命名方式符合您的需求,您只需要进行一些微小的修改即可:cols <- c("香蕉", "甜瓜", "耶"); dto[,(paste0(cols, "_平均值")) := lapply(.SD, mean), by = 分组字段名称, .SDcols = cols] - Mike H.
它正在更新“dto”,你试过在运行后查看“dto”吗? - Mike H.
@BioBroo 我点击了我的个人资料 :) 那里有我的答案。顺便说一下,你看不到输出,因为 := 是通过引用更新的,所以不会创建新对象。但是,你可以在 data.table 命令的末尾添加 [] 来打印结果。 - Frank
在dplyr中,这非常简单:dfo %>% group_by(its) %>% summarise_all(funs(mean = mean)) - alistaire
显示剩余5条评论
3个回答

17

使用 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

显然,可以使用和组合其他函数。希望有所帮助。


15

这个问题的提问者要求从一个列名称的向量中计算多个列的平均值,并且示例代码表明他想要重命名结果列。

虽然被接受的答案评论中提出的方法都不能完全满足这些要求。被接受的答案会计算数据表中所有列的平均值,而且不会重命名结果。评论中提供的方法使用了一个列名称的向量并重命名了结果,但是修改了原始数据表,而提问者期望得到一个新对象

以下代码可以满足提问者的要求:

# 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 保持不变。

编辑 感谢 这个评论这个答案, 有一种方式可以使 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

1
也可以这样做 f <- function(x) list(mean = mean(x)) ; dto[, sapply(.SD, f), .SDcols = cols] 或类似的方式。或者对于多个函数,它可以被概括为 f <- function(x) c(mean = mean(x), max = max(x)) ; dto[, sapply(.SD, f), .SDcols = cols] 或类似的方式,甚至是 f <- function(x) list(mean = mean(x), max = max(x)) ; dto[, unlist(lapply(.SD, f)), .SDcols = cols] - David Arenburg
这段内容取自这里,可能是这个问题的重复目标。 - David Arenburg
@DavidArenburg 很不幸,具有多个函数的通用版本在与分组结合时无法很好地运行。 - Uwe
这是我能想到的最好的 f <- 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] - David Arenburg

0

使用colMeans添加选项

dto[, as.list(colMeans(.SD)), by=its]
   its bananas melonas yeah
1:   1     2.0     7.0 12.0
2:   2     4.5     9.5 14.5

按列名选择

dto[, as.list(colMeans(.SD[, c("bananas", "melonas")])), by=its]
   its bananas melonas
1:   1     2.0     7.0
2:   2     4.5     9.5

或者通过范围

dto[, as.list(colMeans(.SD[, 2:3])), by=its]
   its melonas yeah
1:   1     7.0 12.0
2:   2     9.5 14.5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接