在dplyr中有条件地忽略组_by内的值 请考虑以下事项:

在dplyr中有条件地忽略组_by内的值 请考虑以下事项:,r,dplyr,grouping,R,Dplyr,Grouping,背景 在data.frame中,我有患者id(id)、患者住院的日期(day)、他们当天收到的诊断活动代码(code)、该活动的价格(price)以及该活动的频率(freq) 带有codeb和c的活动同时注册,但其含义大致相同,不应重复计算 问题 我想要的是:如果code“b”和“c”在同一天注册,code“b”应该被忽略 示例data.frame如下所示: x <- data.frame(id = c(rep("a", 4), rep("b", 3)), day

背景

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

带有
code
b
c
的活动同时注册,但其含义大致相同,不应重复计算


问题

我想要的是:如果
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
mutate(code_day = paste0(ifelse(code %in% c("b", "c"), "z", code), day)
x
id日价格代码频率
1 a 1500 a 1
2 a 1 10 b 1
3 a 1 100 c 1
4 a 2 10 b 1
5b110b1
6b210b2
7B3100C2
因此,患者“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.
x%>%
分组依据(id,日期)%>%
总结(res=总和(价格*频率))
#一个tibble:5x3
#组:id[?]
id日资源
一个一个。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

到目前为止,我所有使用
ifelse
mutate
的尝试都失败了


非常感谢您的帮助。提前非常感谢

您可以添加一个
过滤器
行来删除像这样有问题的
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.
x%>%
分组依据(id,日期)%>%
过滤器(!(代码==“b”和“c”%in%code))%>%
总结(res=总和(价格*频率))
id日资源
一个一个。600
2 a 2。10
3 b 1。10
4 b 2。20
5 b 3。200

您可以添加一个
过滤器
行来删除有问题的
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.
x%>%
分组依据(id,日期)%>%
过滤器(!(代码==“b”和“c”%in%code))%>%
总结(res=总和(价格*频率))
id日资源
一个一个。600
2 a 2。10
3 b 1。10
4 b 2。20
5 b 3。200

您可以创建如下新列:

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
mutate(code_day = paste0(ifelse(code %in% c("b", "c"), "z", code), day)
然后,您的所有Bs和Cs都将成为Zs(而不会丢失帮助您区分它们的原始代码列)。然后,您可以按代码降序排列,并删除“代码日”列中的重复值:

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

您可以创建如下所示的新列:

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
mutate(code_day = paste0(ifelse(code %in% c("b", "c"), "z", code), day)
然后,您的所有Bs和Cs都将成为Zs(而不会丢失帮助您区分它们的原始代码列)。然后,您可以按代码降序排列,并删除“代码日”列中的重复值:

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

这正是我需要的,但我不明白为什么。为什么此语句只删除
b
,而不删除
b
c
?谢谢它正在删除每个
id,day
组(
code==“b”
)中的
b
行,前提是该组中还有一个
c
“c”%in%code
),这正是我需要的,但我不明白为什么。为什么此语句只删除
b
,而不删除
b
c
?谢谢它正在删除每个
id,day
组(
code==“b”
)中的
b
行,前提是该组中还有一个
c
“c”%in%code