从数据帧列表中获取列名和数据帧名称到单个数据帧中

我正在寻找一种方法来将数据框列表中的列名和数据框名称转换为单个数据框。它们的列长度不等。做到这一点的最佳方法是什么?

dlist <- list(mtcars[1:2], mtcars[1:3], mtcars[1:4])
names(dlist) <- c("mtcars1", "mtcars2", "mtcars3")

Tried:
dlist |> map(~colnames(.x))

预期输出:

1 mtcars1 mpg   cyl   NA    NA   
2 mtcars2 mpg   cyl   disp  NA   
3 mtcars3 mpg   cyl   disp  hp  

回答

你可以试试:

library(tidyverse)

dlist %>%
  map_df(~names(.x) %>%
           enframe(), .id = "id") %>%
  pivot_wider(names_from = name, id_cols = id)

# A tibble: 3 x 5
  id      `1`   `2`   `3`   `4`  
  <chr>   <chr> <chr> <chr> <chr>
1 mtcars1 mpg   cyl   NA    NA   
2 mtcars2 mpg   cyl   disp  NA   
3 mtcars3 mpg   cyl   disp  hp  

或在基地相同的想法:

reshape(stack(lapply(dlist, names)), idvar = "ind", timevar = "values", direction = "wide", v.names = "values")

      ind values.mpg values.cyl values.disp values.hp
1 mtcars1        mpg        cyl        <NA>      <NA>
3 mtcars2        mpg        cyl        disp      <NA>
6 mtcars3        mpg        cyl        disp        hp


回答

类似于已接受的解决方案,但由于以下原因而更加紧凑unnest_wider

library(tidyr)
library(tibble)
library(purrr)

dlist %>% 
  map(colnames) %>% 
  enframe %>% 
  unnest_wider(value, names_sep = "_")

#> # A tibble: 3 x 5
#>   name    value_1 value_2 value_3 value_4
#>   <chr>   <chr>   <chr>   <chr>   <chr>  
#> 1 mtcars1 mpg     cyl     NA      NA     
#> 2 mtcars2 mpg     cyl     disp    NA     
#> 3 mtcars3 mpg     cyl     disp    hp   


以上是从数据帧列表中获取列名和数据帧名称到单个数据帧中的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>