【问题标题】:Using ifelse in summarize after group_by in dplyr在 dplyr 中的 group_by 之后在汇总中使用 ifelse
【发布时间】:2021-12-15 01:46:14
【问题描述】:

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

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

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 语句以及 if 条件中的 summarise 语句?!

谢谢

【问题讨论】:

  • 请添加您的预期输出。

标签: r dplyr


【解决方案1】:

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

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 &gt; 1 那么我们 sum result 给出 1 个值,否则保持 result 原样返回超过 1 个值。这就是为什么在输出中有 1 行 interval = 2 和多行 interval = 1 的原因。

【讨论】:

    猜你喜欢
    • 2016-09-25
    • 2016-08-18
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    相关资源
    最近更新 更多