R rbind и группа с помощью dplyr - PullRequest
1 голос
/ 24 октября 2019

У меня есть следующие данные

library(dplyr)

df1 <- tibble(
year = c("2001","2001", "2001", "2001", "2002","2002", "2002", "2002"),
type = c("Animals", "Animals", "People", "People", "Animals", "Animals", "People", "People"),
type_group = c("Dogs", "Cats", "John", "Jane", "Dogs", "Cats", "John", "Jane"),
analysis1 = c(32.7, 67.5, 34.6, 56.5, 56.7, 78.5, 98.9, 87.3),
analysis2 = c(23.7, 89.4, 45.8, 98.6, 45.7, 45.7, 23.6, 23.6),
analysis3 = c(45.7, 45.7, 23.6, 23.6, 14.4, 45.4, 98.0, 12.2),
analysis4 = c(14.4, 45.4, 98.0, 12.2, 34.6, 44.3, 23.8, 16.3))

Я использую rbind для создания новых строк с некоторыми новыми вычислениями, которые вы увидите в коде ниже.

Я хочузнать, есть ли более аккуратный и быстрый способ сделать это. Я уверен, что должно быть ... мои данные содержат около 30 лет и около 60 переменных, поэтому, чтобы использовать разработанный мной пример, потребовались бы годы, чтобы написать в сценарии мои реальные данные:

df1 %>% 
  filter(year =="2001") %>% 
rbind(c("2001", "People diff","John and Jane", 
            df1$analysis1[df1$type_group == 'John'] - df1$analysis1[df1$type_group == 'Jane'],
            df1$analysis2[df1$type_group == 'John'] - df1$analysis2[df1$type_group == 'Jane'],
            df1$analysis3[df1$type_group == 'John'] - df1$analysis3[df1$type_group == 'Jane'],
            df1$analysis4[df1$type_group == 'John'] - df1$analysis4[df1$type_group == 'Jane'])) %>% 
  rbind(c("2001","Animals diff","Dogs and cats", 
            df1$analysis1[df1$type_group == 'Cats'] - df1$analysis1[df1$type_group == 'Dogs'],
            df1$analysis2[df1$type_group == 'Cats'] - df1$analysis2[df1$type_group == 'Dogs'],
            df1$analysis3[df1$type_group == 'Cats'] - df1$analysis3[df1$type_group == 'Dogs'],
            df1$analysis4[df1$type_group == 'Cats'] - df1$analysis4[df1$type_group == 'Dogs'])) -> data_2001


df1 %>% 
  filter(year =="2002") %>% 
  rbind(c("2002", "People diff","John and Jane", 
          df1$analysis1[df1$type_group == 'John'] - df1$analysis1[df1$type_group == 'Jane'],
          df1$analysis2[df1$type_group == 'John'] - df1$analysis2[df1$type_group == 'Jane'],
          df1$analysis3[df1$type_group == 'John'] - df1$analysis3[df1$type_group == 'Jane'],
          df1$analysis4[df1$type_group == 'John'] - df1$analysis4[df1$type_group == 'Jane'])) %>% 
  rbind(c("2002","Animals diff","Dogs and cats", 
          df1$analysis1[df1$type_group == 'Cats'] - df1$analysis1[df1$type_group == 'Dogs'],
          df1$analysis2[df1$type_group == 'Cats'] - df1$analysis2[df1$type_group == 'Dogs'],
          df1$analysis3[df1$type_group == 'Cats'] - df1$analysis3[df1$type_group == 'Dogs'],
          df1$analysis4[df1$type_group == 'Cats'] - df1$analysis4[df1$type_group == 'Dogs'])) -> data_2002

rbind(data_2001, data_2002) -> final_data

Любая помощь приветствуется! Спасибо

1 Ответ

1 голос
/ 24 октября 2019

Во-первых, я думаю, что ваш анализ неверен, если он не был предназначен таким образом. В вашем rbind вы включаете данные за два года с помощью df1$analysis1[df1$type_group == 'John'], но связываете их только с одним годом и звоните, например, 2001.

. Быстро и просто можно использовать spread и gather из tidyr упаковки, например

library(tidyr)

df1 %>% 
  gather(analysis, value, -year, -type, -type_group) %>%
  group_by(year, type, analysis) %>%
  summarise( value = diff(value)) %>%
  spread(analysis, value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...