【问题标题】:Ignore value conditionally within group_by in dplyr在 dplyr 的 group_by 中有条件地忽略值
【发布时间】:2018-06-07 10:27:47
【问题描述】:

请考虑以下事项。

背景

data.frame 中,我有患者 ID (id),患者入院的日期 (day),他们当天收到的诊断活动代码 (code),该活动的价格 (price) 和该活动的频率 (freq)。

codebc 的活动是同时注册的,但含义大致相同,不应重复计算。


问题

我想要的是:如果code“b”和“c”注册同一天code“b”应该被忽略。

data.frame 的示例如下所示:

x <- data.frame(id = c(rep("a", 4), rep("b", 3)),
            day = c(1, 1, 1, 2, 1, 2, 3),
            price = c(500, 10, 100, rep(10, 3), 100),
            code = c("a", "b", "c", rep("b", 3), "c"),
            freq = c(rep(1, 5), rep(2, 2))))

> x
  id day price code freq
1  a   1   500    a    1
2  a   1    10    b    1
3  a   1   100    c    1
4  a   2    10    b    1
5  b   1    10    b    1
6  b   2    10    b    2
7  b   3   100    c    2

因此,患者“a”第 1 天的费用将是 600 而不是 610,因为我可以使用以下公式计算:

x %>% 
  group_by(id, day) %>% 
  summarise(res = sum(price * freq))

# A tibble: 5 x 3
# Groups:   id [?]
  id      day   res
  <fct> <dbl> <dbl>
1 a        1.  610.
2 a        2.   10.
3 b        1.   10.
4 b        2.   20.
5 b        3.  200.

可能的方法

当“c”出现在同一天时,我删除观察code“b”,或者如果code“c”出现在code“b”中,我将freq设置为0同一天。

到目前为止,我对ifelsemutate 的所有尝试都失败了。

非常感谢每一个帮助。非常感谢您!

【问题讨论】:

    标签: r dplyr grouping


    【解决方案1】:

    您可以添加filter 行来删除有问题的b 值,如下所示...

    x %>% 
      group_by(id, day) %>% 
      filter(!(code=="b" & "c" %in% code)) %>% 
      summarise(res = sum(price * freq))
    
      id      day   res
      <fct> <dbl> <dbl>
    1 a        1.  600.
    2 a        2.   10.
    3 b        1.   10.
    4 b        2.   20.
    5 b        3.  200.
    

    【讨论】:

    • 这正是我需要的,但我不明白为什么。为什么这个语句只删除b 而不是bc?谢谢!
    • 它正在删除每个 id,day 组 (code=="b") 中的 b 行,前提是该组中还有一个 c ("c" %in% code)
    【解决方案2】:

    您可以像这样创建一个新列:

    mutate(code_day = paste0(ifelse(code %in% c("b", "c"), "z", code), day)
    

    然后你所有的 Bs 和 Cs 都会变成 Zs(不会丢失帮助你区分它们的原始代码列)。然后您可以按代码降序排列并删除 code_day 列中的重复值:

    arrange(desc(code)) %>% # Bs will come after Cs
    distinct(code_day, .keep_all = TRUE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 2015-10-30
      • 1970-01-01
      相关资源
      最近更新 更多