如何将数据帧变量名移动到第一行,并将新变量名添加到列表中的多个数据帧? 库(purrr) 图书馆(tibble) 图书馆(dplyr)

如何将数据帧变量名移动到第一行,并将新变量名添加到列表中的多个数据帧? 库(purrr) 图书馆(tibble) 图书馆(dplyr),r,purrr,tibble,R,Purrr,Tibble,数据帧的起始列表 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 #

数据帧的起始列表

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
add_row
需要“名称-值对,传递到tibble()。只能为中已存在的列定义值。数据列和未设置列将获得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"


最好用一个指针来解决最后一个步骤。

这里有一种方法,使用
数据中的
map
rbindlist
。table
和一些基本R函数:

library(purrr)
library(dplyr)
library(data.table)
map(lst, ~ as.data.frame(unname(rbind(colnames(.x),as.matrix(.x))))) %>%
  rbindlist(idcol = "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
或者,如果我们使用
colnames%,我们可以使用
map\u df

`colnames不太清楚如何通过
purr
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
库(dplyr)

bind_rows(lappy(lst,函数(i){d1在
lst
中创建data.frames时,我稍微更改了示例数据,将
stringsAsFactors
设置为
FALSE

#sample data
lst <- list(df1 = data.frame(X.1 = as.character(1:2),
                             heading = letters[1:2], 
                             stringsAsFactors = FALSE),   # !! <--
            df2 =  data.frame(X.32 = as.character(3:4),
                              another.topic = paste("Line ", 1:2),
                              stringsAsFactors = FALSE)   # !! <--
            )

DT <- data.table::rbindlist( lapply( lst, function(x) rbind( names(x), x ) ), 
                             use.names = FALSE, idcol = "id" )
setnames(DT, names( lst[[1]] ), c("h1", "h2") ) 

#     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
下面是一个使用
data.table::rbindlist()
的解决方案

#示例数据

非常感谢你的建议。次要的一点,我认为在备选方案的末尾有一个多余的括号。很抱歉。修正了。
map_df(lst, ~ as.data.frame(rbind(colnames(.x),as.matrix(.x))) %>%
         `colnames<-`(.,paste0("h",seq(1,dim(.)[2]))), .id = "id")
#   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
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
#sample data
lst <- list(df1 = data.frame(X.1 = as.character(1:2),
                             heading = letters[1:2], 
                             stringsAsFactors = FALSE),   # !! <--
            df2 =  data.frame(X.32 = as.character(3:4),
                              another.topic = paste("Line ", 1:2),
                              stringsAsFactors = FALSE)   # !! <--
            )

DT <- data.table::rbindlist( lapply( lst, function(x) rbind( names(x), x ) ), 
                             use.names = FALSE, idcol = "id" )
setnames(DT, names( lst[[1]] ), c("h1", "h2") ) 

#     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