【问题标题】:convert long-format grouped data to wide format将长格式分组数据转换为宽格式
【发布时间】:2019-09-13 17:35:33
【问题描述】:

我目前有长格式数据

# Input
library(dplyr)
library(tidyr)

tibble(
    x = c(1,1,2,2), 
    y = c("A", "B", "C", "D")
) 

我想扩大数据看起来像这样:

# Desired Output
tibble(
    x = c(1,2), 
    x_1 = c("A", "C"), 
    x_2 = c("B", "D")
) 

但这不是典型的tidyr::spread(),因为我的列名没有变成单元格值。所以虽然这看起来很简单,但我很难过。

【问题讨论】:

  • 答案here 可能会有所帮助

标签: r tidyr


【解决方案1】:
library(data.table)

dcast(df, x ~ paste0('x_', rowid(x)))
#   x x_1 x_2
# 1 1   A   B
# 2 2   C   D

【讨论】:

    【解决方案2】:

    一个选项是按组创建一个序列列,然后执行spread

    library(dplyr)
    library(tidyr)
    library(stringr)
    tbl1 %>% 
        group_by(x) %>% 
        group_by(x1 = str_c('x_', row_number())) %>% 
        # or using paste0 from base R (as @d.b commented)
        # group_by(x1 = paste0('x_', row_number())) %>%
        spread(x1, y)
    # A tibble: 2 x 3
    #      x x_1   x_2  
    #  <dbl> <chr> <chr>
    #1     1 A     B    
    #2     2 C     D    
    

    或在base R

    unstack(df, y~ ave(x, x, FUN = seq_along))
    

    【讨论】:

    • 我在想要的输出中犯了一个错误,该输出已被编辑。感谢您的初步回复。但是您现在会看到 A 和 B 需要位于同一行。为我最初的错误道歉。
    • 您的代码没有问题,我希望更改正确答案状态不是不合适的。今天早上有一篇帖子使用了chop(df,y) %>% unnest_wider(y),它用更少的代码行解决了这个问题。我不确定用于选择第一个正确响应与稍后正确响应的 SO 协议。我真诚地希望你没有因此而生气。你在 SO 上对我和其他许多人都非常有帮助。
    • @Joe 我同意较少的行部分(如果您可以不格式化列名)
    【解决方案3】:

    从 tidyr 1.0.0 你可以执行以下操作:

    library(tidyr)
    
    df <- tibble(
      x = c(1,1,2,2), 
      y = c("A", "B", "C", "D")
    ) 
    
    chop(df,y) %>% unnest_wider(y)
    #> New names:
    #> * `` -> ...1
    #> * `` -> ...2
    #> New names:
    #> * `` -> ...1
    #> * `` -> ...2
    #> # A tibble: 2 x 3
    #>       x ...1  ...2 
    #>   <dbl> <chr> <chr>
    #> 1     1 A     B    
    #> 2     2 C     D
    

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

    将参数 names_repair = ~sub("..." , "x_", ., fixed=TRUE) 添加到 unnest_wider 调用以获取您在问题中提供的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-18
      • 2023-02-25
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多