我有以下数据框
x <- read.table(text = " id1 id2 val1 val2
1 a x 1 9
2 a x 2 4
3 a y 3 5
4 a y 4 9
5 b x 1 7
6 b y 4 4
7 b x 3 9
8 b y 2 8", header = TRUE)
我想计算由id 1和id 2分组的val 1和val 2的平均值,同时计算每个id 1-id 2组合的行数。我可以分别执行每个计算:
# calculate mean
aggregate(. ~ id1 + id2, data = x, FUN = mean)
# count rows
aggregate(. ~ id1 + id2, data = x, FUN = length)
为了在一次调用中完成这两个计算,我尝试
do.call("rbind", aggregate(. ~ id1 + id2, data = x, FUN = function(x) data.frame(m = mean(x), n = length(x))))
但是,我得到了一个乱码输出沿着一个警告:
# m n
# id1 1 2
# id2 1 1
# 1.5 2
# 2 2
# 3.5 2
# 3 2
# 6.5 2
# 8 2
# 7 2
# 6 2
# Warning message:
# In rbind(id1 = c(1L, 2L, 1L, 2L), id2 = c(1L, 1L, 2L, 2L), val1 = list( :
# number of columns of result is not a multiple of vector length (arg 1)
我可以使用plyr包,但是我的数据集相当大,当数据集的大小增加时,plyr非常慢(几乎无法使用)。
如何使用aggregate
或其他函数在一次调用中执行多个计算?
7条答案
按热度按时间dldeef671#
在
dplyr
版本1.0.0之后,上面的summarize_all
和summarize_at
函数被summarize(across(...))
取代,在summarize(across(...))
中可以选择要操作的列(此处为val1:val2
)。我们还可以在
across
中提供一个函数列表,并使用粘附规范设置列名({.col}
=原始列名,{.fn}
=列表中的函数名)。有关
across
的更多信息,请参阅official documentation。yv5phkfx2#
您可以在一个步骤中完成所有操作,并获得正确的标签:
这将创建一个具有两个id列和两个矩阵列的 Dataframe :
正如下面的@lord.garbage所指出的,可以使用
do.call(data.frame, ...)
将其转换为具有“简单”列的 Dataframe 。以下是LHS上多个变量的语法:
sdnqo3pr3#
鉴于这一点,在问题中:
我可以使用plyr包,但是我的数据集相当大,当数据集的大小增加时,plyr非常慢(几乎无法使用)。
然后在
data.table
(1.9.4+
)中,您可以尝试:有关
aggregate
(问题和所有其他3个答案中使用的)与data.table
的时序比较,请参见this benchmark(agg
和agg.x
案例)。b1zrtrql4#
使用
dplyr
套装程式,您可以使用summarise_all
来达成此目的。使用此summarise-function,您可以将其他函数(在本例中为mean
和n()
)套用至每一个非群组数据行:其给出:
如果不想将函数应用于所有非分组列,请指定应应用这些函数的列,或者使用
summarise_at()
函数以减号排除不需要的列:jm81lzqq5#
您可以添加一个
count
列,与sum
聚合,然后回缩以获得mean
:它的优点是保留列名并创建单个
count
列。r3i60tvu6#
也许你想 * 合并 *?
58wvjzkj7#
您也可以使用
plyr::each()
来引入多个函数: