【问题标题】:Add new variable to list of data frames with purrr and mutate() from dplyr使用来自 dplyr 的 purrr 和 mutate() 将新变量添加到数据帧列表
【发布时间】:2017-06-21 02:07:09
【问题描述】:

我知道这里有 许多 相关的问题,但我正在寻找一个 purrr 解决方案,请不要从函数应用列表或 cbind/rbdind 中找到一个(我想这个机会可以更好地了解 purrr)。

我有一个数据框列表,我想为列表中的每个数据框添加一个新列。该列的值将是数据框的名称,即列表中每个元素的名称。

有类似的here,但它涉及到函数的使用和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 的 cmets,一些数据使问题可重现

# 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"
              )

【问题讨论】:

  • 您需要通过添加数据来制作您的示例reproducible
  • 我认为这里没有必要,阿利斯泰尔,正如 Jake 的回答所示,这是一个关于语法的问题。
  • It is always necessary,否则问题将被关闭。 How to Ask
  • 我的错误,现在修正。
  • 更好,尽管您也应该显示所需的输出。假设一点,你可以做dplyr::bind_rows(list_df, .id = 'id')

标签: r dplyr purrr


【解决方案1】:

您的问题是,当您不使用 mutate 和管道时,您必须明确提供对数据的引用。为此,我建议使用map2_df

dff <- map2_df(comentarios, names(comentarios), ~ mutate(.x, ID = .y)) 

【讨论】:

  • 它只是映射了两个参数。第一个参数是.x 数据帧列表,第二个参数是.y 数据帧名称列表。
  • 当然,但我没想到我可以那样做,这就是我的意思。这正是我要求 purrr 回答的原因,因为我想更好地了解这个包。再次感谢您的帮助。
  • @JakeKaupp - 这部分的含义是什么:“.id = “Group”。当我省略这个时 - 代码仍然可以正常工作
  • 这是一个错字和放错位置的括号。 . id 是 OP 问题中的一个经济变量。
  • 仅供参考,从 purrr_0.2.3 开始,当您想要遍历列表和名称(或索引)同时进行。
【解决方案2】:

使用 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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2019-11-29
    • 2018-09-23
    • 1970-01-01
    相关资源
    最近更新 更多