【问题标题】:Avoiding missing row after summarise避免在汇总后丢失行
【发布时间】:2015-01-03 15:36:48
【问题描述】:

我在 Windows 上使用 RStudio 版本 0.98.1028。总结一个多级数据框,包dplyr,使用函数sum(),我丢了一行,里面有sum = 0。换句话说,如果我的原始数据框类似于

group <- as.factor(rep(c('X', 'Y'), each = 1, times = 6))
type <- as.factor(rep(c('a', 'b'), each = 2, times = 3))
day <- as.factor(rep(1:3, each = 4))

df = data.frame(type = type, day = day, value = abs(rnorm(12)))
df = df[day != 1 | type != 'a',]

我总结一下

df1 = df %>%
    group_by(day, type) %>%
    summarise(sum = sum(value))

然后我得到一个缺失的行,这是我想要的 day = 1type = a 之间的交互(即使它是 0...)

提前致谢!

EB

【问题讨论】:

  • 你能举一个代表问题的可重现的小例子吗?
  • 对不起,我的错。我将编辑问题
  • 这正是重点!我在此处提供的示例相对于我实际处理的内容非常简化,但它非常能代表我的问题...
  • @Emiliano 在子集数据集中,没有day=1type=a 的组合行
  • @Emiliano 在我看来,即使在子集之后,您也想要所有组合。 IE。不在子集数据集中的组合应该总和为0。如果是这种情况,我在下面发布了一个解决方案。

标签: r dplyr summarization


【解决方案1】:

你可以试试left_join

library(dplyr)
left_join(expand.grid(type=unique(df$type), day=unique(df$day)), df1) %>%
                            group_by(day, type) %>%
                            summarise(sum=sum(value, na.rm=TRUE))
#  day type       sum
#1   1    a 0.0000000
#2   1    b 0.5132914
#3   2    a 1.2482210
#4   2    b 0.9232343
#5   3    a 2.0381779
#6   3    b 0.7558351

df1 在哪里

 df1 <- df[day != 1 | type != 'a',]

【讨论】:

  • 我认为 df[day != 1 | type != 'a',] 不是 OP 认为的那样,所以最好用基于 df 变量的子集代码替换它。
  • @docendodiscimus 我会等待 OP 的回复,就像我在帖子上发表的评论一样。
  • 不幸的是,您建议的代码无法正常工作,原因是我实际上有一个奇怪的数据库,变量 day 和另一个变量之间缺少许多交互。对于df[day != 1 | type != 'a',],我只是想重现我的情况。我重写了我的剧本。非常感谢您的帮助!
猜你喜欢
  • 2015-06-06
  • 2011-06-12
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2021-01-28
相关资源
最近更新 更多