我有一个较大的df,如下图所示,在此每两年一次的事件中,我想知道(使用组成的df中的术语)知道哪个ID在最长的时间内具有相同的果实。即每隔一年才会有一次结果子的机会。
df<-data.frame("id"=c(1, 1, 1, 2, 2, 2, 2, 3, 3, 3),
"Year"=c(1981, 1981, 1985, 2011, 2011, 2013, 2015, 1921, 1923, 1955),
"fruit"=c("banana", "apple", "banana", "orange", "melon", "orange",
"orange", "melon", "melon", "melon"))
我尝试了不同种类的group_by
,请参见下面的cumsum
。
df<-df %>% mutate(year_diff=cumsum(c(1, diff(df$Year)>1)))
df %>% group_by(id, fruit) %>% filter(year_diff==2)
和下面的一个(重新加载df之后)
df %>% group_by(id, fruit) %>% mutate(year_diff=cumsum(c(1, diff(df$Year)>1)))
并玩弄:
df %>% group_by(id, fruit) %>% mutate(summarise(n_years=n_distinct(Year)))
最后,理想情况下,我希望像下面的小动作那样排列ID(及其水果),以便在事件中(随着时间的推移)谁拥有水果的最连续“保留”顺序。请记住,该活动仅每两年举行一次。
id fruit occurence
2 orange 3
3 melon 2
1 banana 1
1 apple 1
2 melon 1
3 melon 1
我了解有几个步骤。
编辑: 也许有一种方法可以修改:
df %>% group_by(id, fruit) %>% summarise(n_years=n_distinct(Year)) %>% arrange(desc(n_years)) %>% ungroup()
,以便它在原始小标题中创建一个新列(我无法做到,但您可能会做到),然后可以过滤连续事件?
答案 0 :(得分:2)
使用dplyr
通过arrange
,id
和fruit
Year
行,并创建一个显示连续年份的新分组变量(group
)每个id
和fruit
,然后计算每个组中的行数。
library(dplyr)
df %>%
arrange(id, fruit, Year) %>%
group_by(id, fruit, group = cumsum(c(2, diff(Year)) != 2)) %>%
summarise(n = n()) %>%
ungroup() %>%
select(-group)
# id fruit n
# <dbl> <fct> <int>
#1 1 apple 1
#2 1 banana 1
#3 1 banana 1
#4 2 melon 1
#5 2 orange 3
#6 3 melon 2
#7 3 melon 1