1

我最近在这个链接中问了一个关于 R 包 tidyr、dplyr 或类似的数据库管理的问题(Reorganizing columns by two column combination)。

这很有帮助,我设法完成了建议的代码,但我以我需要的最终格式绞尽脑汁。

我无法达到这种格式,并且想知道如何轻松完成。

鉴于此作为示例数据库:

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 求和。

4

1 回答 1

0

我们按'Factor1'、'Factor2'、'Year'分组,得到所有列的sum(为“宽”格式summarise_allgatherunitespread

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

这也可以使用dcastfrom来完成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))
于 2019-06-24T08:44:03.560 回答