r 过滤数据框 group_by,并找到 cumusm
r filter dataframe group_by, and find cumusm
我有一个df的方式如下
id = c(1, 1, 2, 2, 3, 4, 4, 4)
val = c("AAA", "BBB", "BBB", "CCC", "AAA", "BBB", "AAA", "CCC")
df = data.frame(id= id, val=val)
我想至少删除一次不包含给定字符串的组(此处为“AAA”),
然后按组查找“AAA”出现的总和。
在示例中,组 id=4 中的第一个元素“BBB”被删除,因为它出现在“AAA”之前。
输出看起来像
id = c( 1, 1, 3, 4, 4)
val = c("AAA","BBB","AAA","AAA","CCC")
cs = c( 1, 1, 2, 3, 3)
df = data.frame(id= id, val=val, cs)
您可以使用 dplyr
库尝试以下操作:
library(dplyr)
df %>%
group_by(id) %>%
filter(if(any(val == 'AAA')) row_number() >= match('AAA', val) else FALSE) %>%
mutate(cs = cur_group_id())
#For dplyr < 1.0.0
#ungroup %>% mutate(cs = match(id, unique(id)))
# id val cs
# <dbl> <chr> <int>
#1 1 AAA 1
#2 1 BBB 1
#3 3 AAA 2
#4 4 AAA 3
#5 4 CCC 3
我们 select 每个 id
值后的所有行 "AAA"
。
我有一个df的方式如下
id = c(1, 1, 2, 2, 3, 4, 4, 4)
val = c("AAA", "BBB", "BBB", "CCC", "AAA", "BBB", "AAA", "CCC")
df = data.frame(id= id, val=val)
我想至少删除一次不包含给定字符串的组(此处为“AAA”), 然后按组查找“AAA”出现的总和。 在示例中,组 id=4 中的第一个元素“BBB”被删除,因为它出现在“AAA”之前。
输出看起来像
id = c( 1, 1, 3, 4, 4)
val = c("AAA","BBB","AAA","AAA","CCC")
cs = c( 1, 1, 2, 3, 3)
df = data.frame(id= id, val=val, cs)
您可以使用 dplyr
库尝试以下操作:
library(dplyr)
df %>%
group_by(id) %>%
filter(if(any(val == 'AAA')) row_number() >= match('AAA', val) else FALSE) %>%
mutate(cs = cur_group_id())
#For dplyr < 1.0.0
#ungroup %>% mutate(cs = match(id, unique(id)))
# id val cs
# <dbl> <chr> <int>
#1 1 AAA 1
#2 1 BBB 1
#3 3 AAA 2
#4 4 AAA 3
#5 4 CCC 3
我们 select 每个 id
值后的所有行 "AAA"
。