我知道在SO上有很多相关的问题,但我正在寻找一个purrr解决方案,而不是apply函数列表或cbind / rbdind(我想借此机会更好地了解purrr)。
我有一个数据框列表,我想为列表中的每个数据框添加一个新列。该列的值将是数据框的名称,即列表中每个元素的名称。
这里有一个类似的问题(链接),但它涉及使用函数和mutate_each()
,而我只需要mutate()
。
为了让你了解列表(名为comentarios
),这里是str()
在第一个元素上的第一行:
> str(comentarios[1])
List of 1
$ 166860353356903_661400323902901:'data.frame': 13 obs. of 7 variables:
我希望我的新变量作为每个数据框的ID,在结果中包含13行,其值为166860353356903_661400323902901
。
我尝试的方法是:
dff <- map_df(comentarios,
~ mutate(ID = names(comentarios)),
.id = "Group"
)
然而,mutate()
需要数据框的名称才能正常工作:
Error in mutate_(.data, .dots = lazyeval::lazy_dots(...)) :
argument ".data" is missing, with no default
在每个名称中进行处理没有意义,这样会陷入循环范围并失去purrr(和R更普遍)的优势。如果列表较小,我将使用reshape :: merge_all(),但它有超过2000个元素。提前感谢您的任何帮助。
< p >编辑:根据alistaire的评论,提供一些数据以使问题可重现# install.packages("tidyverse")
library(tidyverse)
df <- data_frame(one = rep("hey", 10), two = seq(1:10), etc = "etc")
list_df <- list(df, df, df, df, df)
names(list_df) <- c("first", "second", "third", "fourth", "fifth")
dfs <- map_df(list_df,
~ mutate(id = names(list_df)),
.id = "Group"
)
dplyr::bind_rows(list_df, .id = 'id')
。 - alistaire