R:根据列表元素名称创建新的 Dataframe 变量
R: Create New Dataframe Variable Based on List Element Name
我有一个 list
的 11 个数据框,每个数据框的名称描述了它的来源。本质上,我想向列表中的每个数据框添加一个“源”列,其中包含每个单元格中数据框的名称。
这样就可以将数据向下游传递到不能很好地处理列表的 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 在评论中指出的那样,您必须命名列表元素。假设它们都遵循“source_name_”的模式,您可以使用 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)
我有一个 list
的 11 个数据框,每个数据框的名称描述了它的来源。本质上,我想向列表中的每个数据框添加一个“源”列,其中包含每个单元格中数据框的名称。
这样就可以将数据向下游传递到不能很好地处理列表的 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 在评论中指出的那样,您必须命名列表元素。假设它们都遵循“source_name_”的模式,您可以使用 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)