Объединение и суммирование строк в R - PullRequest
1 голос
/ 02 августа 2020

У меня есть следующий набор данных со следующими переменными:

member_id - номер идентификатора для каждого члена

year - год, о котором идет речь

gender - двоичная переменная, 0 - мужчина, 1 - женщина

party - партия участника

Leadership - TRUE если участник занимает руководящую позицию в правительстве или оппозиции, FALSE в противном случае

house_start - дата, когда член стал депутатом

Year.Entered - год, когда он стал депутатом

Years.in.parliament - сколько лет прошло с момента их первого избрания

Edu - сколько времени депутат участвовал в дебатах, связанных с образованием в данном году.

  member_id year gender                   party Leadership house_start Year.Entered Years.in.parliament Edu
1       386 1997      0            Conservative      FALSE  03/05/1979         1979                 18    7
2        37 1997      0                  Labour      FALSE  03/05/1979         1979                 18   10
3        47 1997      0                  Labour       TRUE  09/06/1983         1983                 14  157
4       408 1997      0            Conservative       TRUE  03/05/1979         1979                 18   48
5        15 1997      1        Liberal Democrat      FALSE  09/06/1983         1983                 14    3
6        15 1997      1        Liberal Democrat       TRUE  09/06/1983         1983                 14    9
  

Как видно из строк 5 и 6 в наборе данных, один и тот же элемент записывается дважды за один год. Это произошло во всем наборе данных для некоторых членов из-за переменной Leadership. Например, этот член (идентификационный номер 15) не занимал руководящей должности в первой половине 1997 года, но получил ее позже в том же году. Я хочу иметь возможность объединить эти две строки и иметь в этих случаях переменную Leadership как TRUE. Мне также нужно вычислить сумму Edu строк для них, так что для этого члена это будет 12 (потому что я хочу, чтобы каждый член участвовал в год для этой области политики несколько раз). Итак, я хочу, чтобы это выглядело так:

  member_id year gender                   party Leadership house_start Year.Entered Years.in.parliament Edu
1       386 1997      0            Conservative      FALSE  03/05/1979         1979                 18    7
2        37 1997      0                  Labour      FALSE  03/05/1979         1979                 18   10
3        47 1997      0                  Labour       TRUE  09/06/1983         1983                 14  157
4       408 1997      0            Conservative       TRUE  03/05/1979         1979                 18   48
5        15 1997      1        Liberal Democrat       TRUE  09/06/1983         1983                 14   12
  

Я пытался изменить их вручную в Excel, но мне нужно сделать это для нескольких различных областей политики, поэтому это занимает много времени. Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

3 голосов
/ 02 августа 2020

Мы можем сделать группу по sum и arrange и slice первой строке

library(dplyr)
df1 %>%
     group_by(member_id, year, gender, party) %>%
     mutate(Edu = sum(Edu)) %>% 
     arrange(party, desc(Leadership)) %>% 
     slice(1)
0 голосов
/ 02 августа 2020

Насколько я понимаю, минимальная повторяющаяся группа - это member_id & year, мы можем затем суммировать сумму Edu в целях защиты (используя na.rm = TRUE), а затем нарезать сгруппированный data.frame с помощью логической алгебры (беря максимум логический вектор дает истинные записи).

library(dplyr)
df %>% 
  group_by(member_id, year) %>% 
  mutate(Edu = sum(Edu, na.rm = TRUE)) %>% 
  slice(which.max(Leadership)) %>% 
  ungroup()

В качестве альтернативы мы можем использовать функцию top_n (которая дает тот же результат):

df %>% 
  group_by(member_id, year) %>% 
  mutate(Edu = sum(Edu, na.rm = TRUE)) %>% 
  top_n(1, Leadership) %>% 
  ungroup()
0 голосов
/ 02 августа 2020

Для каждой группы вы можете выбрать строки, в которых есть только одна строка или строка, где Leadership равно TRUE.

library(dplyr)

df %>%
  group_by(member_id, year, gender, party) %>%
  mutate(Edu = sum(Edu)) %>%
  filter(n() == 1 | Leadership)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...