根据通用 ID 删除 NA 的行组合

Row combination to remove NA's based on common ID's

我最近在 link () 中问了一个关于 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)

但这并没有像我想要的那样对常见年份的 value1 求和。

我们按'Factor1'、'Factor2'、'Year'分组,得到所有列(summarise_all)的sum,然后gather转换为 'long' 格式,unite 将 'Year'、'key' 列组合在一起以创建单个列,并且 spread 从 'long' 到 'wide'格式

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

这也可以通过 data.table 中的 dcast 来完成,我们可以在其中传递多个 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))