首页 > 解决方案 > 如何将 col 名称作为第一行绑定到列表中的每个 data.frame

问题描述

我有一个列表列表,每个子列表也有多个 dfs。我想将名称(df)绑定到df。我怎样才能做到这一点?

数据:

q1<-list(Demographics = list(`101-01-101` = structure(list(SubjectID = "101-01-101", 
    BRTHDTC = "1953-07-07", SEX = "Female"), row.names = c(NA, 
-1L), class = c("tbl_df", "tbl", "data.frame")), `101-02-102` = structure(list(
    SubjectID = "101-02-102", BRTHDTC = "1963-07-02", SEX = "Female"), row.names = c(NA, 
-1L), class = c("tbl_df", "tbl", "data.frame")), `101-03-103` = structure(list(
    SubjectID = "101-03-103", BRTHDTC = "1940-09-11", SEX = "Male"), row.names = c(NA, 
-1L), class = c("tbl_df", "tbl", "data.frame")), `101-04-104` = structure(list(
    SubjectID = "101-04-104", BRTHDTC = "1955-12-31", SEX = "Male"), row.names = c(NA, 
-1L), class = c("tbl_df", "tbl", "data.frame")), `104-05-201` = structure(list(
    SubjectID = "104-05-201", BRTHDTC = "1950-12-04", SEX = "Female"), row.names = c(NA, 
-1L), class = c("tbl_df", "tbl", "data.frame"))), DiseaseStatus = list(
    `101-01-101` = structure(list(SubjectID = "101-01-101", DSDT = "2016-03-14", 
        DSDT_P = NA_character_), row.names = c(NA, -1L), class = c("tbl_df", 
    "tbl", "data.frame")), `101-02-102` = structure(list(SubjectID = "101-02-102", 
        DSDT = "2017-04-04", DSDT_P = NA_character_), row.names = c(NA, 
    -1L), class = c("tbl_df", "tbl", "data.frame")), `101-03-103` = structure(list(
        SubjectID = "101-03-103", DSDT = NA_character_, DSDT_P = "UN-UNK-2015"), row.names = c(NA, 
    -1L), class = c("tbl_df", "tbl", "data.frame")), `101-04-104` = structure(list(
        SubjectID = "101-04-104", DSDT = "2016-05-02", DSDT_P = NA_character_), row.names = c(NA, 
    -1L), class = c("tbl_df", "tbl", "data.frame")), `104-05-201` = structure(list(
        SubjectID = "104-05-201", DSDT = "2018-07-06", DSDT_P = NA_character_), row.names = c(NA, 
    -1L), class = c("tbl_df", "tbl", "data.frame"))))

我的代码不起作用:

q2<-imap(q1, ~ map(.x, ~
 .x %>%
 map(~ bind_rows(names(.x), .x) )))

我的预期结果是这样的:

在此处输入图像描述

标签: rpurrr

解决方案


使用基础 R lapply-

lapply(q1, function(x) lapply(x, function(y) rbind(names(y), y)))

#$Demographics
#$Demographics$`101-01-101`
# A tibble: 2 x 3
#  SubjectID  BRTHDTC    SEX   
#  <chr>      <chr>      <chr> 
#1 SubjectID  BRTHDTC    SEX   
#2 101-01-101 1953-07-07 Female

#$Demographics$`101-02-102`
# A tibble: 2 x 3
#  SubjectID  BRTHDTC    SEX   
#  <chr>      <chr>      <chr> 
#1 SubjectID  BRTHDTC    SEX   
#2 101-02-102 1963-07-02 Female
#...
#...

您的尝试很接近,但几乎不需要更改 -

  • 你不需要 3map
  • bind_rows需要一个数据框或小标题来组合。names(.x)是一个字符向量,所以我们可以使用rbind.
library(purrr)
map(q1, function(x) map(x, ~rbind(names(.x), .x)))

推荐阅读