在R中展开命名列表-将名称转换为第一列



比方说,我有一个命名列表:

library(dplyr)
myData <- mtcars %>%
group_by(cyl) %>%
group_map(~ head(.x, 1L))
names(myData) <- c("Mazda", "Honda", "Suzuki")

现在,我想将列表转换为一个如下所示的表格:

name  mpg disp  hp drat   wt  qsec vs am gear carb
1:  Mazda 22.8  108  93 3.85 2.32 18.61  1  1    4    1
2:  Honda 21.0  160 110 3.90 2.62 16.46  0  1    4    4
3: Suzuki 18.7  360 175 3.15 3.44 17.02  0  0    3    2

我试过了:

data.frame(Reduce(rbind, myData))
do.call(rbind.data.frame, myData)

但两者都导致了一个没有名称的data.table。如何将列表转换为列为names的data.table?

library(data.table)
rbindlist(myData, idcol = "name")
#      name  mpg disp  hp drat   wt  qsec vs am gear carb
# 1:  Mazda 22.8  108  93 3.85 2.32 18.61  1  1    4    1
# 2:  Honda 21.0  160 110 3.90 2.62 16.46  0  1    4    4
# 3: Suzuki 18.7  360 175 3.15 3.44 17.02  0  0    3    2

或在基地R:

data.frame(name = names(myData), do.call(rbind, myData))

具有tidyverse的选项将是

library(dplyr)
bind_rows(myData, .id = 'name')

基本R选项

cbind(
name = names(myData),
do.call(rbind, c(myData, use.names = FALSE))
)

给出

name  mpg disp  hp drat   wt  qsec vs am gear carb
1  Mazda 22.8  108  93 3.85 2.32 18.61  1  1    4    1
2  Honda 21.0  160 110 3.90 2.62 16.46  0  1    4    4
3 Suzuki 18.7  360 175 3.15 3.44 17.02  0  0    3    2
# data:
library(tidyverse)
myData <- mtcars %>%
group_by(cyl) %>%
group_map(~ head(.x, 1L))
names(myData) <- c("Mazda", "Honda", "Suzuki")

purrr::imap中,波浪号快捷方式(~(使.x表示输入,而.y表示输入的名称。_dfr-后缀使映射函数返回tibble而不是列表。

myData |> 
imap_dfr(~ mutate(.x, name = .y))

给予:

#> # A tibble: 3 × 11
#>     mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb name  
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> 
#> 1  22.8   108    93  3.85  2.32  18.6     1     1     4     1 Mazda 
#> 2  21     160   110  3.9   2.62  16.5     0     1     4     4 Honda 
#> 3  18.7   360   175  3.15  3.44  17.0     0     0     3     2 Suzuki

相关内容

  • 没有找到相关文章

最新更新