使用 dplyr 的 purrr 和 mutate() 将新变量添加到数据帧列表
Add new variable to list of data frames with purrr and mutate() from dplyr
我知道这里有 许多 相关问题,但我正在寻找一个 purrr 解决方案,拜托,不是来自函数应用列表或 cbind/rbdind(我想借此机会更好地了解purrr)。
我有一个数据框列表,我想为列表中的每个数据框添加一个新列。该列的值将是数据框的名称,即列表中每个元素的名称。
有类似的东西,但它涉及函数的使用和mutate_each()
,而我只需要mutate()
。
为了让您了解列表(称为 comentarios
),这里是第一个元素上 str()
的第一行:
> str(comentarios[1])
List of 1
$ 166860353356903_661400323902901:'data.frame': 13 obs. of 7 variables:
所以我希望我的新变量在结果中包含 13 行的 166860353356903_661400323902901
,作为每个数据帧的 ID。
我正在尝试的是:
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 个元素。在此先感谢您的帮助。
编辑:根据 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"
)
您的问题是,当您不使用带有管道的 mutate 时,您必须明确提供对数据的引用。为此,我建议使用 map2_df
dff <- map2_df(comentarios, names(comentarios), ~ mutate(.x, ID = .y))
使用 OP 的数据,答案是
library(tidyverse)
df <- data_frame(one = rep("hey", 10), two = seq(1:10), etc = "etc")
list_df <- list(df, df, df, df, df)
dfnames <- c("first", "second", "third", "fourth", "fifth")
dfs <- list_df %>% map2_df(dfnames,~mutate(.x,name=.y))
我知道这里有 许多 相关问题,但我正在寻找一个 purrr 解决方案,拜托,不是来自函数应用列表或 cbind/rbdind(我想借此机会更好地了解purrr)。
我有一个数据框列表,我想为列表中的每个数据框添加一个新列。该列的值将是数据框的名称,即列表中每个元素的名称。
有类似的东西mutate_each()
,而我只需要mutate()
。
为了让您了解列表(称为 comentarios
),这里是第一个元素上 str()
的第一行:
> str(comentarios[1])
List of 1
$ 166860353356903_661400323902901:'data.frame': 13 obs. of 7 variables:
所以我希望我的新变量在结果中包含 13 行的 166860353356903_661400323902901
,作为每个数据帧的 ID。
我正在尝试的是:
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 个元素。在此先感谢您的帮助。
编辑:根据 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"
)
您的问题是,当您不使用带有管道的 mutate 时,您必须明确提供对数据的引用。为此,我建议使用 map2_df
dff <- map2_df(comentarios, names(comentarios), ~ mutate(.x, ID = .y))
使用 OP 的数据,答案是
library(tidyverse)
df <- data_frame(one = rep("hey", 10), two = seq(1:10), etc = "etc")
list_df <- list(df, df, df, df, df)
dfnames <- c("first", "second", "third", "fourth", "fifth")
dfs <- list_df %>% map2_df(dfnames,~mutate(.x,name=.y))