使用r中的dplyr和data.table:聚合然后与原始表连接

3

我经常使用以下dplyr语法计算数据框的汇总统计信息:

1. Aggregate <- 
2. Original Dataset %>%
3. Group_By %>%
4. Filter %>% 
5. Summarize %>%
6. Left_Join(back to Aggregate)

例如:

Original <- data.frame(A = 1:100,B = sample(LETTERS,100,replace = TRUE),C = rnorm(100))

# Calculate 1st Summary Statistic
Aggregate <- Original %>% group_by(B) %>% 
             filter(A > 50) %>% 
             summarize(meanC = mean(C))

# Calculate 2nd Summary Statistic
Aggregate <- Original %>% group_by(B) %>% 
             summarize(Q = sum(C)) %>%
             left_join(x = Aggregate,y = Original,by = "B")

我的问题有两个方面:

A)是否有更好的方法基于另一个表构建摘要统计表?左连接感觉非常笨重。

B)如何使用"data.table"方式来做这件事,即如何加入返回到聚合表?

Aggregate[Aggregate[,meanC:=mean(C),by=.(B)]]

感谢您提供的任何建议...

2
在 data.table 中,不需要合并,只需使用 orig[ , meanC := mean(C), by=B] - DanY
@DanY 感谢您的评论,这很有用。在这种情况下,我该如何计算聚合表呢?聚合表只有26行,每个组只有一行。 - shwan
我想问题在于我经常遇到这样的情况,即我想通过一行计算大量数据的多个摘要,即聚合... - shwan
在你的例子中,第一个“Aggregate”表有一个过滤语句,但第二个没有,这是笔误吗?如果不是,你真的想要在同一个数据框中连接具有不同条件的摘要列吗? - Mike
1
对于同时使用data.table进行多个汇总,可以查阅':='()符号以及带有.SDcolslapply - DanY
显示剩余4条评论
1个回答

2

如果你在 group_by 后进行 mutate,而不是 summarize,就可以避免 join。 (注意:我不知道如何以这种方式执行过滤的汇总统计。而且后来你可能想要取消分组以避免意外行为。)

library(tidyverse)
Original <- data.frame(A = 1:100,B = sample(LETTERS,100,replace = TRUE),C = rnorm(100))

# Calculate unfiltered summary statistic, as in OP
Aggregate_OP <- Original %>% 
  group_by(B) %>% 
  summarize(meanC = mean(C)) %>% 
  right_join(Original) %>% 
  select(A, B, C, meanC) # reorder columns
#> Joining, by = "B"

# Simpler, using mutate
Aggregate_mutate <- Original %>% 
  group_by(B) %>% 
  mutate(meanC = mean(C)) %>% 
  ungroup()

identical(Aggregate_OP, Aggregate_mutate)
#> [1] TRUE

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