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_”的模式,您可以使用 dplyrpurrr 使用您的玩具数据

来做到这一点
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)