首页 > 解决方案 > 在 dplyr 中的 group_by 之后在汇总中使用 ifelse

问题描述

我想对包含多个分组级别的数据集进行分组。但是,我在某个日期之后开始对变量进行加权的数据集。

因此,我想对一个变量求和,但在特定日期之后。在该日期之前,我希望该变量的值保持不变。如下,

score <- data.frame(
  id = c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2), 
  interval = c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,
    1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2), 
  category = c(1,1,2,2,3,3,4,4,5,5,1,1,2,2,3,3,4,4,5,5,
    1,1,2,2,3,3,4,4,5,5,1,1,2,2,3,3,4,4,5,5), 
  subcategory = c(1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,
    1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2), 
  result = c(92,92,88,88,78,78,78,78,98,98,82,82,84,84,75,
    75,86,86, 64,64,95,95,96,96,63,63,96,96,69,69,78,78,
    88,88, 96,96,69,69,96,96))

由于每个分组级别可以有多个输入,因此每个组只需要一个值。因此,我只选择了一个值然后分组。

这是我的尝试:

S1 <- score %>%
  distinct(id, interval,category, .keep_all = TRUE)%>%
  group_by(id, interval) %>%
  do(if(.$interval > 1)){summarize(sumresult = sum(result), .groups = 'drop')} else{.$interval})

我不断收到以下消息:

Error in summarize(sumresult = sum(result), .groups = "drop") : 
  object 'result' not found
In addition: There were 36 warnings (use warnings() to see them)

我也试过ifelse,但它也不起作用

如何group_by在 if 条件内的 summarise 语句之后包含 if 语句?!

谢谢

标签: rdplyr

解决方案


您尚未共享您正在寻找的预期输出,但根据您的尝试,我认为您可以尝试 -

library(dplyr)

score %>%
  distinct(id, interval,category, .keep_all = TRUE)%>%
  group_by(id, interval) %>%
  summarise(sumresult = if(all(interval > 1)) sum(result) else result, .groups = 'drop')

#      id interval sumresult
#   <dbl>    <dbl>     <dbl>
# 1     1        1        92
# 2     1        1        88
# 3     1        1        78
# 4     1        1        78
# 5     1        1        98
# 6     1        2       391
# 7     2        1        95
# 8     2        1        96
# 9     2        1        63
#10     2        1        96
#11     2        1        69
#12     2        2       427

如果interval > 1然后我们给出 1 个值,否则保持sum原样返回超过 1 个值。这就是为什么您在输出中有 1 行和多行的原因。resultresultinterval = 2interval = 1


推荐阅读