在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
)