【问题标题】:Row combination to remove NA's based on common ID's基于通用 ID 删除 NA 的行组合
【发布时间】:2019-06-24 08:41:26
【问题描述】:

我最近在此链接 (Reorganizing columns by two column combination) 中询问了有关 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 进行求和。

【问题讨论】:

    标签: r dplyr reshape tidyr database-management


    【解决方案1】:

    我们按'Factor1','Factor2','Year'分组,得到所有列的sumsummarise_all),然后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.tabledcast 来完成,我们可以在其中传递多个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))
    

    【讨论】:

    • 这正是我想要的。感谢您还提供了一个替代包。我需要了解 tidyverse 函数!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    相关资源
    最近更新 更多