根据 dplyr 中的范围总结条件
Summarize with conditions based on ranges in dplyr
我的例子有一个插图。
示例数据:
df <- data.frame(ID = c(1, 1, 2, 2, 3, 5), A = c("foo", "bar", "foo", "foo", "bar", "bar"),
B = c(1, 5, 7, 23, 54, 202))
df
ID A B
1 1 foo 1
2 1 bar 5
3 2 foo 7
4 2 foo 23
5 3 bar 54
6 5 bar 202
我想做的是汇总,按ID,统计相同的ID。此外,我希望子组中的 ID 频率基于不同数值范围内的 B 值(B>=0 & B<5、B>=5 & B<10、B>=10 & B<15、B 的观察次数>=15 & B<20 等所有 ID)。
我想要这个结果:
ID count count_0_5 count_5_10 etc
1 1 2 1 1 etc
2 2 2 NA 1 etc
3 3 1 NA NA etc
4 5 1 NA NA etc
我使用包 dplyr
:
尝试了这段代码
df %>%
group_by(ID) %>%
summarize(count=n(), count_0_5 = n(B>=0 & B<5))
但是,它 returns 这个错误:
`Error in n(B>=0 & B<5) :
unused argument (B>=0 & B<5)`
也许用 sum(B>=0 & B<5)
替换 n(B>=0 & B<5)
?
这将计算满足两个指定条件的案例数。
但是,您将得到 0's
而不是 NA's
。这可以通过以下方式解决:
ifelse(sum(B>=0 & B<5)>0, sum(B>=0 & B<5), NA)
我很确定可能有更好的解决方案(更清晰和高效),但这应该可行!
library(dplyr)
library(tidyr)
df %>% group_by(ID) %>%
mutate(B_cut = cut(B, c(0,5,10,15,20,1000), labels = c('count_0_5','count_5_10','count_10_15','count_15_20','count_20_1000')), count=n()) %>%
group_by(ID,B_cut) %>% mutate(n=n()) %>% slice(1) %>% select(-A,-B) %>%
spread(B_cut, n)
#2nd option
left_join(df %>% group_by(ID) %>% summarise(n=n()),
df %>% mutate(B_cut = cut(B, c(0,5,10,15,20,1000), labels = c('count_0_5','count_5_10','count_10_15','count_15_20','count_20_1000'))) %>%
count(ID,B_cut) %>% spread(B_cut,n),
by='ID')
# A tibble: 4 x 5
# Groups: ID [4]
ID count count_0_5 count_5_10 count_20_1000
<dbl> <int> <int> <int> <int>
1 1 2 2 NA NA
2 2 2 NA 1 1
3 3 1 NA NA 1
4 5 1 NA NA 1
我的例子有一个插图。 示例数据:
df <- data.frame(ID = c(1, 1, 2, 2, 3, 5), A = c("foo", "bar", "foo", "foo", "bar", "bar"),
B = c(1, 5, 7, 23, 54, 202))
df
ID A B
1 1 foo 1
2 1 bar 5
3 2 foo 7
4 2 foo 23
5 3 bar 54
6 5 bar 202
我想做的是汇总,按ID,统计相同的ID。此外,我希望子组中的 ID 频率基于不同数值范围内的 B 值(B>=0 & B<5、B>=5 & B<10、B>=10 & B<15、B 的观察次数>=15 & B<20 等所有 ID)。
我想要这个结果:
ID count count_0_5 count_5_10 etc
1 1 2 1 1 etc
2 2 2 NA 1 etc
3 3 1 NA NA etc
4 5 1 NA NA etc
我使用包 dplyr
:
df %>%
group_by(ID) %>%
summarize(count=n(), count_0_5 = n(B>=0 & B<5))
但是,它 returns 这个错误:
`Error in n(B>=0 & B<5) :
unused argument (B>=0 & B<5)`
也许用 sum(B>=0 & B<5)
替换 n(B>=0 & B<5)
?
这将计算满足两个指定条件的案例数。
但是,您将得到 0's
而不是 NA's
。这可以通过以下方式解决:
ifelse(sum(B>=0 & B<5)>0, sum(B>=0 & B<5), NA)
我很确定可能有更好的解决方案(更清晰和高效),但这应该可行!
library(dplyr)
library(tidyr)
df %>% group_by(ID) %>%
mutate(B_cut = cut(B, c(0,5,10,15,20,1000), labels = c('count_0_5','count_5_10','count_10_15','count_15_20','count_20_1000')), count=n()) %>%
group_by(ID,B_cut) %>% mutate(n=n()) %>% slice(1) %>% select(-A,-B) %>%
spread(B_cut, n)
#2nd option
left_join(df %>% group_by(ID) %>% summarise(n=n()),
df %>% mutate(B_cut = cut(B, c(0,5,10,15,20,1000), labels = c('count_0_5','count_5_10','count_10_15','count_15_20','count_20_1000'))) %>%
count(ID,B_cut) %>% spread(B_cut,n),
by='ID')
# A tibble: 4 x 5
# Groups: ID [4]
ID count count_0_5 count_5_10 count_20_1000
<dbl> <int> <int> <int> <int>
1 1 2 2 NA NA
2 2 2 NA 1 1
3 3 1 NA NA 1
4 5 1 NA NA 1