Комбинация строк для удаления NA на основе общих идентификаторов - PullRequest
1 голос
/ 24 июня 2019

Я недавно задал вопрос, касающийся управления базами данных в пакетах R tidyr, dplyr или аналогичных по этой ссылке ( Реорганизация столбцов по комбинации двух столбцов ).

Это было полезно, мне удалось сделать предложенный код, но я выжимал в окончательном формате, который мне требовался.

Мне не удается добраться до этого формата, и мне было интересно, как это легко сделать.

В качестве примера базы данных:

Factor 1    Factor 2        Year    value1   value2
A            green          2016     1.9      20
A            green          2015     1.9      20
A            green          2015      4       30
B            yellow         2015      3       10
B            yellow         2016      8       11

И пытается получить:

Factor 1    Factor 2   value1.2015   value1.2016 value2.2015 value2.2016   
A            green          5.9          1.9            50           20
B            yellow         3            8              10           11

Итак, было бы установить общие идентификаторы для фактора 1 и фактора 2, чтобы распределить набор данных по годам и суммировать общие годы для значений 1 и 2

Я - новичок с tidyr, dplyr, и мне нелегко это сделать.

Я смог распространить набор данных по годам:

df.spread<-df %>%
  gather(value1,value2,-factor1,-factor2,-Year) %>%
  unite(Year,Year, value1, sep = "") %>%
  spread(Year,value2)

но это не суммирует значение1 для обычных лет, как я хочу.

1 Ответ

0 голосов
/ 24 июня 2019

Мы группируем по «Фактору1», «Фактору2», «Году», получаем sum всех столбцов (summarise_all), затем gather в «длинном» формате, unite «Году», «ключевые» столбцы вместе, чтобы создать один столбец и spread из «длинного» в «широкий» формат

library(tidyverse)
df %>% 
    group_by(Factor1, Factor2, Year) %>%
    summarise_all(sum) %>% 
    gather(key, value, value1:value2) %>% 
    unite(Year, key, Year, sep=".") %>% 
    spread(Year, value)
# Groups:   Factor1, Factor2 [2]
#  Factor1 Factor2 value1.2015 value1.2016 value2.2015 value2.2016
#  <chr>   <chr>         <dbl>       <dbl>       <dbl>       <dbl>
#1 A       green           5.9         1.9          50          20
#2 B       yellow          3           8            10          11

Это также можно сделать с помощью dcast из data.table, где мы можем передать несколько столбцов value.var и аргумент fun.aggregate

library(data.table)
dcast(setDT(df), Factor1 + Factor2 ~ Year, value.var = c('value1', 'value2'), sum)
#    Factor1 Factor2 value1_2015 value1_2016 value2_2015 value2_2016
#1:       A   green         5.9         1.9          50          20
#2:       B  yellow         3.0         8.0          10          11

данные

df <- structure(list(Factor1 = c("A", "A", "A", "B", "B"), Factor2 = c("green", 
"green", "green", "yellow", "yellow"), Year = c(2016L, 2015L, 
2015L, 2015L, 2016L), value1 = c(1.9, 1.9, 4, 3, 8), value2 = c(20L, 
20L, 30L, 10L, 11L)), class = "data.frame", row.names = c(NA, 
-5L))
...