【问题标题】:Reshaping df with dplyr using gather / spread with multiple variables使用 dplyr 重塑 df 使用具有多个变量的收集/传播
【发布时间】:2019-03-14 05:58:23
【问题描述】:

我正在尝试使用 dplyr 收集和传播函数重塑我的数据集,以从该数据形状中移动:

library(tidyverse)
# test data set
df = tibble(factor = c("a","a","b","b"),
           factor2 = c("d1","d2","d1","d2"),
           value1 = round(rnorm(4),1)*10,
           value2 = round(runif(4),2)*100)

看起来像这样:

# A tibble: 4 x 4
  factor factor2 value1 value2
  <chr>  <chr>    <dbl>  <dbl>
1 a      d1           4     97
2 a      d2         -21     10
4 b      d1          -2     65
5 b      d2         -14     93

到看起来像这样的东西:

factor    d1val1   d1val2  d2val1  d2val2
a          4        97      -21     10
b         -2        65      -14     93

理想情况下,我想通过 dplyr spread/gather 来实现这一点。

【问题讨论】:

标签: r reshape


【解决方案1】:

为了完整起见,dcast() 实现能够同时重塑多个变量:

library(data.table)
dcast(setDT(df), factor ~ factor2, value.var = c("value1", "value2"))
   factor value1_d1 value1_d2 value2_d1 value2_d2
1:      a         4       -21        97        10
2:      b        -2       -14        65        93

【讨论】:

    【解决方案2】:

    一个选项是将 gather 'value' 列转换为 'long' 格式,然后 unite 'factor2' 和 'key' 列创建单个列,然后 spread 将它返回到 'wide ' 格式

    library(dplyr)
    library(tidyr)
    df %>% 
      gather(key, val, value1:value2) %>% 
      unite(dcols, factor2, key, sep = "") %>%
      spread(dcols, val)
    

    由于列类型相同,使用gatherspread可以这样做

    【讨论】:

      【解决方案3】:

      另一个tidyverse 可能是:

      df %>% 
       gather(var, val, -c(factor, factor2)) %>%
       mutate(var = paste0(factor2, var)) %>%
       select(-factor2) %>%
       spread(var, val) 
      
        factor d1value1 d1value2 d2value1 d2value2
        <chr>     <dbl>    <dbl>    <dbl>    <dbl>
      1 a            -4       85       -4       65
      2 b             4       39       -1       20
      

      它首先将数据从宽格式转换为长格式,不包括变量“factor”和“factor2”。其次,它将“factor2”中的值和变量名称组合在一起。最后,它会删除冗余变量并将数据返回到所需的格式。

      【讨论】:

        猜你喜欢
        • 2012-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-09
        • 1970-01-01
        • 2015-07-14
        • 2012-10-02
        • 1970-01-01
        相关资源
        最近更新 更多