【发布时间】:2018-12-22 07:45:39
【问题描述】:
我有一个像下面这样的大 df,我想知道(使用组成的 df 中的术语)知道在这个半年一次的活动中哪个 id 在最长的时间内具有相同的水果。 IE。每隔一年才有一次收获果实的机会。
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)))
最后,理想情况下,我想要一个像下面这样的 tibble,按照在事件中(随着时间的推移)拥有最多连续“持有”水果的人的顺序排列 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()
以便它在原始 tibble 中创建一个新列(我无法做到,但您可能会这样做),然后我可以过滤连续事件?
【问题讨论】:
-
我不确定我是否完全理解这个问题。您要为每个水果 + ID 组计算什么?
-
在第一个代码示例中尝试交换代码行
mutate和group_by然后filter。 -
@RonakShah 抱歉,我看错了我自己的数字。我会编辑它。
-
那你如何选择 Banana 而不是 apple 呢?它们都出现为 1。
-
@RuiBarradas 我也试过了。如果你的意思是:
df %>% mutate(year_diff=cumsum(c(1, diff(df$Year)>1)))%>%group_by(id, fruit) %>% filter(year_diff==2)