【问题标题】:Long to wide data with tidyR?tidyR 从长到宽的数据?
【发布时间】:2015-05-22 16:01:12
【问题描述】:

我的数据看起来像这样

df = data.frame(name=c("A","A","B","B"),
                group=c("g1","g2","g1","g2"),
                V1=c(10,40,20,30),
                V2=c(6,3,1,7))

我想把它重塑成这样:

df = data.frame(name=c("A", "B"),               
                V1.g1=c(10,20),
                V1.g2=c(40,30),
                V2.g1=c(6,1),
                V2.g2=c(3,7))

tidyR 可以做到吗?

我可以通过重塑来做到这一点

reshape(df, idvar='name', timevar='group', direction='wide')

但是学习新东西总是好的。

【问题讨论】:

    标签: r tidyr


    【解决方案1】:

    reshape 代码很紧凑,因为它适用于多个值列。在tidyr 中使用相同的方法可能需要几个步骤。使用gather 将“宽”格式转换为“长”格式,这样会有一个“Val”列,unite“Var”(来自上一步)和“组”列创建一个“VarG”列,然后使用spread 将“长”格式重新转换为“宽”格式。

    library(tidyr)
    gather(df, Var, Val, V1:V2) %>% 
                    unite(VarG, Var, group) %>% 
                    spread(VarG, Val)
    #    name V1_g1 V1_g2 V2_g1 V2_g2
    #1    A    10    40     6     3
    #2    B    20    30     1     7
    

    【讨论】:

    • V1:V2 部分对我来说是新的。如果您键入 V1,那么您也在过滤数据。这很有用。
    • @jazzurro 我认为如果有更多选择,?select from dplyr 会很有用(即starts_with, ends_with, ....)
    • 感谢您的提示。从现在开始,我将在gather() 中应用选择选项。
    【解决方案2】:

    data.table v1.9.5+ 中的dcast 可以处理多个value.var 列。因此我们可以这样做:

    library(data.table) # v1.9.5+
    dcast(setDT(df), name ~ group, value.var=c("V1", "V2"))
    #    name V1_g1 V1_g2 V2_g1 V2_g2
    # 1:    A    10    40     6     3
    # 2:    B    20    30     1     7
    

    基本上不需要熔炼和浇铸,而是直接浇铸。关注these instructions即可安装。

    【讨论】:

      【解决方案3】:

      tidyr 1.0.0 开始,您可以执行以下操作:

      library(tidyr)
      
      df = data.frame(name=c("A","A","B","B"),
                      group=c("g1","g2","g1","g2"),
                      V1=c(10,40,20,30),
                      V2=c(6,3,1,7))
      
      pivot_wider(df, names_from = "group", values_from = c("V1", "V2"), names_sep = ".")
      #> # A tibble: 2 x 5
      #>   name  V1.g1 V1.g2 V2.g1 V2.g2
      #>   <fct> <dbl> <dbl> <dbl> <dbl>
      #> 1 A        10    40     6     3
      #> 2 B        20    30     1     7
      

      reprex package (v0.3.0) 于 2019-09-14 创建

      【讨论】:

        【解决方案4】:
        df1 %>%
            gather(!c("name","group"), key="var" ,value="value") %>%
            unite(col='temp', c('var','group'), sep='.') %>%
            spread(temp, value=value)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-17
          • 2021-01-14
          • 1970-01-01
          • 2019-03-03
          • 2015-06-10
          相关资源
          最近更新 更多