Использование group_by для подсчета разницы в значениях - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть большое значение df, подобное приведенному ниже, где я хочу знать (используя термины из составленного df), чтобы узнать, какие идентификаторы имеют одинаковые плоды в течение самого длительного периода времени в этом событии, проводимом два раза в год.Т.е. возможность держать фрукт появляется только раз в два года.

 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     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 голосов
/ 22 декабря 2018

Используя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...