【问题标题】:Using group_by to count difference in values使用 group_by 计算值的差异
【发布时间】: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_bycumsum,见下文。

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 组计算什么?
  • 在第一个代码示例中尝试交换代码行 mutategroup_by 然后 filter
  • @RonakShah 抱歉,我看错了我自己的数字。我会编辑它。
  • 那你如何选择 Banana 而不是 apple 呢?它们都出现为 1。
  • @RuiBarradas 我也试过了。如果你的意思是:df %&gt;% mutate(year_diff=cumsum(c(1, diff(df$Year)&gt;1)))%&gt;%group_by(id, fruit) %&gt;% filter(year_diff==2)

标签: r dplyr


【解决方案1】:

使用dplyr 我们arrange 行由idfruitYear 并创建一个新的分组变量(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

【讨论】:

  • 耶!谢谢!它工作顺利。周末愉快。你救了我的。
猜你喜欢
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 1970-01-01
  • 2022-11-01
  • 2016-06-14
相关资源
最近更新 更多