library(purrr)
library(tibble)
library(dplyr)
数据框的起始列表
lst <- list(df1 = data.frame(X.1 = as.character(1:2),
heading = letters[1:2]),
df2 = data.frame(X.32 = as.character(3:4),
another.topic = paste("Line ", 1:2)))
lst
#> $df1
#> X.1 heading
#> 1 1 a
#> 2 2 b
#>
#> $df2
#> X.32 another.topic
#> 1 3 Line 1
#> 2 4 Line 2
预期的“组合”数据框,每个组成数据框的第一行具有一致的新变量名和旧变量名。
#> id h1 h2
#> 1 df1 X.1 heading
#> 2 df1 1 a
#> 3 df1 2 b
#> 4 df2 X.32 another.topic
#> 5 df2 3 Line 1
#> 6 df2 4 Line 2
add_row
需要“名称-值对,传递给 tibble()。只能为 .data 中已存在的列定义值,未设置的列将获得 NA 值。”
这是我认为我已经取得的成就:
df_nms <-
map(lst, names) %>%
map(set_names)
#> $df1
#> X.1 heading
#> "X.1" "heading"
#>
#> $df2
#> X.32 another.topic
#> "X.32" "another.topic"
但我无法完成最后一点,使用 purrr 函数将名称添加到每个数据帧的头部。我已经尝试了 map2
和 pmap
的多种变体,这是我目前能得到的最接近的(如果我将 add_row
视为公式,并在其前面加上前缀~
并删除 .y
我得到一个新的第一行填充了 NAs)。我想我缺少如何将名称-值对传递给 add_row 函数。
map2(lst, df_nms, add_row(.x, .y, .before = 1)) %>%
map(set_names, c("h1", "h2")) %>%
map_dfr(bind_rows, .id = "id")
#> Error in add_row(.x, .y, .before = 1): object '.x' not found
非常感谢解决最后一步的指针。
最佳答案
不太确定如何通过 purrr
map 函数来做到这一点,但这里有一个替代方案,
library(dplyr)
bind_rows(lapply(lst, function(i){d1 <- as.data.frame(matrix(names(i), ncol = ncol(i)));
rbind(d1, setNames(i, names(d1)))}), .id = 'id')
# id V1 V2
#1 df1 X.1 heading
#2 df1 1 a
#3 df1 2 b
#4 df2 X.32 another.topic
#5 df2 3 Line 1
#6 df2 4 Line 2
关于r - 如何将数据框变量名移动到第一行并将新变量名添加到列表中的多个数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62154062/