【发布时间】:2018-01-18 18:03:03
【问题描述】:
我对 R 比较陌生,我似乎无法将列表标准应用于我试图总结的 data.frame。我一直在阅读一堆不同的帖子,但它们似乎只关注一个级别的分组,而不是第二个级别。
假设我的 df 看起来像这样(我的实际数据框要大得多。有 35 种不同的“代码”和大约 20 种不同的“颜色”)
Code Color Value
[1] A Red 10
[2] A Blue 15
[3] A Red 5
[4] B Green 20
[5] B Red 15
[6] C Green 10
理想情况下,我想创建一个汇总表,使我能够按代码对数据进行分组(我已经成功地使用 Group by 和 Split 做到了这一点),但我还想创建一个值的总和按标准“颜色”。目前,我只能通过逐个运行条件来完成此操作。
到目前为止,我已经能够做到这一点:
#this gives me the total value by each code, like a pivot or a sumif
dfsummary <-df %>% group_by(Code) %>% summarise (total = sum(Value))
#then I was able to come up with this to give me, by Code, value by Color.
dfsummary2 <- df %>% filter(Color == "Red") %>% group_by(Code)
%>% summarise(sumRed = sum(Value))
dfsummary2中的结果是:
Code sumRed
[1] A 15
[2] B 15
[3] C 0
我想要完成的是为所有“颜色”创建一个数据框,而不必单独指定每一个。
我想要的输出,我们称之为 dfsummaryall,看起来像:
Code sumRed sumBlue sumGreen
[1] A 15 15 0
[2] B 15 0 20
[3] C 0 0 10
这就是我被难住的地方。我可以单独运行每个,然后将它们合并到一个表中,但我想找到一种在应用函数中工作的方法(我想是 lapply)。这就是我绝对是新手的地方。
到目前为止,我的尝试是这样的:
colors <- c("Red","Blue","Green")
dfsummaryall <- lapply(colors, function(x){dftmp <- df %>%
dplyr::filter(Color == x) %>% group_by(Code) %>%
summarise(x == sum(MktValue)
我知道“summarise(x == sum(MktValue)”部分肯定有问题,但我真的不知道如何解决这个问题。
任何帮助将不胜感激!
【问题讨论】:
-
df %>% group_by(Code, Color) %>% summarise(Sum = sum(Value)) %>% tidyr::spread(Color, Sum, fill = 0)? -
我发现我做错了事。谢谢!这正是我所需要的。我想我从来没有想过 group_by 可以容纳多个级别。
-
继续:如何处理然后提取不同代码组合的总和。假设您想从 dfsummaryall 中查看以下“代码”组合的所有列(“颜色”)的总和(代码 =“A”和“B”,代码 =“B”和“C”,代码 =“ A”和“C”)。 "