【问题标题】:mutate_at to date across multiple tibblesmutate_at 迄今为止跨越多个小标题
【发布时间】:2018-05-22 08:53:32
【问题描述】:

我有一个小标题列表,以及一个我希望转换为日期类的列列表。

library(tibble)
library(purrr)
library(lubridate)

df1 <- tribble(~date_a,    ~value_a,
               "2017-1-3", 10,
               "2018-2-7", 13,
               "2018-5-7", 35)

df2 <- tribble(~date_b,    ~value_b,
               "2014-1-7", 10,
               "2018-4-9",  6,
               "2018-5-8", 18)

list_dfs <- list(df1, df2)
list_dates <- c("date_a", "date_b")

尝试使用purrr:mapdplyr:mutate_atlubridate::ymd 有效地转换它们,但收到以下错误消息:

list_dfs %>% map(~mutate_at(.x, vars(list_dates), ymd))
Error: Strings must match column names. Unknown columns: date_b

This 看起来很相似,但我无法在小标题和列上进行映射。

我需要对purrr::map2 做些聪明的事吗?

【问题讨论】:

  • 为什么“df1”和“df2”用引号括起来,你也应该用list()而不是c
  • 好点——我的错!将编辑。

标签: r dplyr lubridate purrr


【解决方案1】:

你是对的,你可以使用purrr::map2,其中第一个参数是你的小标题列表,第二个参数是列名列表

list_dfs <- list(df1, df2)
list_dates <- c("date_a", "date_b")

result <- map2(list_dfs, list_dates, ~ mutate_at(.x, .y, ymd))

result

# [[1]]
# # A tibble: 3 x 2
#   date_a     value_a
#   <date>       <dbl>
# 1 2017-01-03     10.
# 2 2018-02-07     13.
# 3 2018-05-07     35.

# [[2]]
# # A tibble: 3 x 2
#   date_b     value_b
#   <date>       <dbl>
# 1 2014-01-07     10.
# 2 2018-04-09      6.
# 3 2018-05-08     18.

for (i in seq_along(result)) {
    assign(paste0("df", i), result[[i]])
}

【讨论】:

  • 谢谢 - 这行得通。作为后续,我将如何将这些变异的列保存在原始小标题中? map2_dfmap2_dfc 似乎没有这样做
  • @PeterMacPherson 我已经用可能的解决方案更新了我的答案。它适用于您的具体示例,但如果您的数据帧不称为 df1、df2、df3 等,则无法推广。
  • 如果list_df 被命名(即:list_dfs &lt;- list('df1' = df1, 'df2' = df2)),您可以使用list2env(result, envir = .GlobalEnv) 将变量分配回全局环境
  • 你可能不应该这样做。如果超过 2 或 3 个,我想不出将编号的 data.frames 排除在列表之外是合理的情况。
  • 如果你真的需要,你可以使用tibble::lst(df1,df2)而不是list(df1,df2),你将能够使用@GGamba的评论并避免assign上的循环。
猜你喜欢
  • 2013-03-06
  • 1970-01-01
  • 2012-07-08
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多