R:根据列表元素名称创建新的数据框变量

Posted

技术标签:

【中文标题】R:根据列表元素名称创建新的数据框变量【英文标题】:R: Create New Dataframe Variable Based on List Element Name 【发布时间】:2020-09-23 14:31:49 【问题描述】:

我有一个包含 11 个数据框的 list,每个数据框的名称都描述了它的来源。本质上,我想为列表中的每个数据框添加一个“源”列,其中包含每个单元格中数据框的名称。

这一切都是为了让数据可以向下游传递到不能很好地与列表配合使用的 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]`

【问题讨论】:

你的列表没有名字,所以names(df_list) 会返回NULL,如何得到source_name?是否必须为每个数据框手动定义? 啊,感谢您接受这个问题,我将编辑问题。是的,我正在修改导入到 R 的源名称,原始名称只是“sheet1”、“sheet2”等。 不用担心我的解决方案对您有用吗? 是的,感谢您的帮助,我现在已经实现了。我想知道,我可以使用类似的方法来更改列名吗? 是的,您想在建立列表后重命名它们吗?例如,您可以添加到最后一个命令 `%>% purrr::map(~ rename(.x, new_name = p1, another_name = p2))` 【参考方案1】:

正如@monte 在 cmets 中所指出的,您必须命名列表元素。假设他们都遵循“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)  


【讨论】:

以上是关于R:根据列表元素名称创建新的数据框变量的主要内容,如果未能解决你的问题,请参考以下文章

R语言学习 第七篇:列表

基于变量名称的列表元素 R

根据名称将列表元素替换为另一个列表元素

根据R中的元素名称从列表中提取对象

使用字典和数据框创建带有循环的变量名称的新数组

根据列表中的数据框创建数据框,并在R中的列中包含最大值