使用group_by计数值差异

时间:2018-12-22 07:45:40

标签: r dplyr

我有一个较大的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()

,以便它在原始小标题中创建一个新列(我无法做到,但您可能会做到),然后可以过滤连续事件?

1 个答案:

答案 0 :(得分:2)

使用dplyr通过arrangeidfruit Year行,并创建一个显示连续年份的新分组变量(group)每个idfruit,然后计算每个组中的行数。

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