从数据帧列表中获取列名和数据帧名称到单个数据帧中
我正在寻找一种方法来将数据框列表中的列名和数据框名称转换为单个数据框。它们的列长度不等。做到这一点的最佳方法是什么?
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