Комбинация строк для удаления NA на основе общих идентификаторов

Недавно я задал вопрос об управлении базой данных в пакетах 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 для обычных лет, как я этого хочу.


person gfmg1992    schedule 24.06.2019    source источник


Ответы (1)


Мы группируем по «Фактору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))
person akrun    schedule 24.06.2019
comment
Это именно то, что я искал. Спасибо за предоставление альтернативного пакета. Мне нужно разобраться с функциями tidyverse! - person gfmg1992; 24.06.2019