r - 如何将 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) )))
我的预期结果是这样的:
解决方案
使用基础 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
#...
#...
您的尝试很接近,但几乎不需要更改 -
- 你不需要 3
map
的 bind_rows
需要一个数据框或小标题来组合。names(.x)
是一个字符向量,所以我们可以使用rbind
.
library(purrr)
map(q1, function(x) map(x, ~rbind(names(.x), .x)))
推荐阅读
- laravel-8 - Laravel 中的 any() 和 all() 方法的目的是什么?
- java - How to make query operation works
- java - Giving space to text inputed into editText
- android - 如何完成我的 recyclerView OnClickListener?
- android - 科学计算器中用户输入的数学表达式
- python - TensorFlow 在训练 NN 时可以采用外部 Python 函数吗?
- flutter - Flutter_Unity_Widget:初始化失败,你的硬件不支持这个应用
- java - 使用 Spring 在多模块 Maven 项目中进行集成测试
- arrays - 用 C 中的另一个词替换字符串中的一个词
- python - 由于错误而停止时如何使python脚本自行重启