我有一个由11个数据帧组成的list
,每个数据帧的名称描述其来源。本质上,我想添加一个";源";列添加到列表中的每个数据帧,该列表包含每个单元格中数据帧的名称。
这一切都是为了让数据可以向下传递到CRAN包,而CRAN包在处理列表时效果不佳。
我试过使用lapply
,并查看了一些其他SO答案,但似乎没有合适的答案。
非常感谢您的帮助
- 谢谢
## Some toy data
p1 <- c("A", "B", "C", "D", "E")
p2 <- c(rnorm(5, 1.25, 1))
p3 <- c(rnorm(5, 1.25, 1))
source_name_1 <- data.frame(p1, p2, p3)
p2 <- c(rnorm(5, 1.25, 1))
p3 <- c(rnorm(5, 1.25, 1))
source_name_2 <- data.frame(p1, p2, p3)
p2 <- c(rnorm(5, 1.25, 1))
p3 <- c(rnorm(5, 1.25, 1))
source_name_3 <- data.frame(p1, p2, p3)
df_list <- list(source_name_1,
source_name_2,
source_name_3)
names(df_list) = paste0("source_name_", 1:length(df_list))
## Previous attempt based on other SO answers
df_list_2 <- lapply(names(df_list),
function(x) cbind(df_list),
source = names(df_list),
SIMPLIFY = TRUE)
#essentially I'm aiming for a 'p4' column in each df comprised of `^source_name[1-9]`
正如@monte在注释中所指出的,您必须命名列表元素。假设它们都遵循一个模式;源名称;你可以使用dplyr
和purrr
,使用你的玩具数据
df_list <- list(source_name_1,
source_name_2,
source_name_3)
names(df_list) = paste0("source_name_", 1:length(df_list))
library(dplyr)
library(purrr)
purrr::map2(df_list, names(df_list), ~ mutate(.x, p4 = .y))
#> $source_name_1
#> p1 p2 p3 p4
#> 1 A 0.1531752 1.5198717 source_name_1
#> 2 B 0.8299500 1.4534902 source_name_1
#> 3 C 2.1038329 0.3968661 source_name_1
#> 4 D 2.3939380 1.0487960 source_name_1
#> 5 E 1.5773872 1.8611408 source_name_1
#>
#> $source_name_2
#> p1 p2 p3 p4
#> 1 A 0.8662918 -1.014854 source_name_2
#> 2 B -1.8042179 1.339152 source_name_2
#> 3 C 1.4786439 -1.940525 source_name_2
#> 4 D 1.8360023 1.439776 source_name_2
#> 5 E 0.9648816 2.051714 source_name_2
#>
#> $source_name_3
#> p1 p2 p3 p4
#> 1 A 1.268633 1.7334884 source_name_3
#> 2 B 1.615704 1.0503553 source_name_3
#> 3 C 2.056368 1.4954794 source_name_3
#> 4 D 2.335987 1.6293595 source_name_3
#> 5 E 1.236283 0.4498371 source_name_3
玩具数据
## Some toy data
p1 <- c("A", "B", "C", "D", "E")
p2 <- c(rnorm(5, 1.25, 1))
p3 <- c(rnorm(5, 1.25, 1))
source_name_1 <- data.frame(p1, p2, p3)
p2 <- c(rnorm(5, 1.25, 1))
p3 <- c(rnorm(5, 1.25, 1))
source_name_2 <- data.frame(p1, p2, p3)
p2 <- c(rnorm(5, 1.25, 1))
p3 <- c(rnorm(5, 1.25, 1))
source_name_3 <- data.frame(p1, p2, p3)