разделить-применить-объединить R - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть таблица данных с несколькими столбцами.Скажем,

Location, который может включать Los Angles и т. Д.

age_Group, скажем, (young, child, teenager) и т. Д.

year = (2000, 2001, ..., 2015)

month = c(jan, ..., dec) Я хотел бы group_by их и посмотреть, сколько людей потратило деньги за определенные промежутки времени, скажем, у меня есть интервалы interval_1 = (1, 100), (100, 1000), ..., interval_20=(1000, infinity)

Как мне поступить?Что мне делать после следующего?

data %>% group_by(location, age_Group, year, month)

образец:

location age_gp  year month   spending
LA       child   2000   1         102
LA       teen    2000   1         15
LA       teen    2000   10        9
NY       old     2000   11        1000
NY       old     2010   2         1000000
NY       teen    2020   3         10

желаемый результат

LA, child, 2000, jan  interval_1
LA, child, 2000, feb  interval_20
...
NY  OLD    2015   Dec  interval_1

последний столбец должен быть определен путем добавления расходоввсех людей, принадлежащих к одному городу, возраст_группа, год, месяц.

1 Ответ

0 голосов
/ 06 февраля 2019

Вы можете сначала создать новый столбец (spending_cat), используя, например, функцию cut.После того, как вы можете добавить новую переменную как переменную группировки, а затем вам просто нужно сосчитать:

df <- data.frame(group = sample(letters[1:4], size = 1000, replace = T),
                 spending = rnorm(1000))

df %>% 
  mutate(spending_cat = cut(spending, breaks = c(-5:5))) %>%
  group_by(group, spending_cat) %>%
  summarise(n_people = n())

# A tibble: 26 x 3
# Groups:   group [?]
   group spending_cat n_people
   <fct> <fct>           <int>
 1 a     (-3,-2]             6
 2 a     (-2,-1]            36
 3 a     (-1,0]             83
 4 a     (0,1]              78
 5 a     (1,2]              23
 6 a     (2,3]              10
 7 b     (-4,-3]             1
 8 b     (-3,-2]             4
 9 b     (-2,-1]            40
10 b     (-1,0]             78
# … with 16 more rows
...