【问题标题】:Pivoting a table without key-value pairs [duplicate]透视没有键值对的表[重复]
【发布时间】:2023-09-30 01:53:01
【问题描述】:

我有一个格式为

的数据框
table_name <- c("city", "city", "city", "car", "car", "country", "country", "country", "country", "country")
column <- c("Vienna", "Paris", "London", "Honda", "Nissan", "Germany", "Spain", "Italy", "Portugal", "France")

df <- data.frame(table_name, column)

   table_name   column
1        city   Vienna
2        city    Paris
3        city   London
4         car    Honda
5         car   Nissan
6     country  Germany
7     country    Spain
8     country    Italy
9     country Portugal
10    country   France

我想扩大这个表格并以这种格式获得它:

  table_name  column1   column2  column3  column4    column5                                 
1 "city"      "Vienna"  "Paris"  "London" ""         ""      
2 "car"       "Honda"   "Nissan" ""       ""         ""      
3 "country"   "Germany" "Spain"  "Italy"  "Portugal" "France"

有没有一种优雅的方式来使用 reshape2 或 tidyr 做到这一点?我不介意是否有空字符串或 NULL 值。新列的命名应该只是添加下一个整数,或者其他什么。

它不是键值对的形式,所以我有点挣扎。

【问题讨论】:

    标签: r tidyr reshape2


    【解决方案1】:

    我们可以创建一个序列列并使用pivot_wider

    library(dplyr)
    library(tidyr)
    library(stringr)
    library(data.table)
    df %>%
       mutate(col1 = str_c('column', rowid(table_name))) %>% 
       pivot_wider(names_from = col1, values_from = column)
    # A tibble: 3 x 6
    #  table_name column1 column2 column3 column4  column5
    #  <fct>      <fct>   <fct>   <fct>   <fct>    <fct>  
    #1 city       Vienna  Paris   London  <NA>     <NA>   
    #2 car        Honda   Nissan  <NA>    <NA>     <NA>   
    #3 country    Germany Spain   Italy   Portugal France 
    

    或者使用来自data.tabledcast

    library(data.table)
    dcast(setDT(df), table_name ~ paste0('column',
           rowid(table_name)), value.var = 'column')
    #  table_name column1 column2 column3  column4 column5
    #1:        car   Honda  Nissan    <NA>     <NA>    <NA>
    #2:       city  Vienna   Paris  London     <NA>    <NA>
    #3:    country Germany   Spain   Italy Portugal  France
    

    【讨论】:

    • library(stringr) 在第一个备选方案中缺少 str_c。但两者都工作得很好。谢谢!