使用 purrr 影响列表中每个数据框的单列

using purrr to affect single columns of each dataframe in a list

还在习惯咕噜声,我有一个问题我认为应该很简单,但我不知道该怎么做。我想要做的就是将下面的日期时间转换为 as.Date() 的日期。这是一个数据框列表。一直在玩,但还没有找到有用的东西......感谢任何帮助。

df <- data.frame(Date = seq.POSIXt(Sys.time(), Sys.time() + hours(24), by = "hour"),
             useless = "ignore me")
df2 <- data.frame(Date = seq.POSIXt(Sys.time(), Sys.time() + hours(1), by = "min"),
                    useless = "ignore me")
mylist <- list(df,df2)
mylist %<>% map(?????)

您可以将 map() 与 dplyr 包(也是 tidyverse)中的 mutate() 结合使用。 map() 可用于应用 mutate() 列表中的每个数据框。 mutate() 可以将 as.Date() 应用于 Date 列。你会这样写:

map(mylist, mutate, Date = as.Date(Date))

这行是说:

  • map()/对mylist
  • 中的每个对象应用mutate()函数
  • 每次将 mutate() 应用于一个对象时,就好像您在写 mutate(object, Date = as.Date(Date))

完整代码:

library(lubridate)
library(purrr)
library(dplyr)

df <- data.frame(Date = seq.POSIXt(Sys.time(), Sys.time() + hours(24), by = "hour"),
                 useless = "ignore me")
df2 <- data.frame(Date = seq.POSIXt(Sys.time(), Sys.time() + hours(1), by = "min"),
                  useless = "ignore me")
mylist <- list(df,df2)
mylist <- map(mylist, mutate, Date = as.Date(Date))

实现目标的规范方法是将 mapdplyr 中的某些动词结合使用,例如 mutate_at。目前purrr还有dmap_at的功能,但以后会从purrr中移除。

因此,您将 map 遍历您的列表,然后将日期列修改为 mutate_at:

library(purrr)
library(lubridate)
library(dplyr)

mylist %>%
  map(~mutate_at(.x, "Date", as.Date))

您也可以使用 at_depth,在 at_depth(1, ...) 的情况下等于 map,因此没有必要:

mylist %>%
  at_depth(1, ~mutate_at(.x, "Date", as.Date))

留在 purrr 内的原始方法是使用 dmap_at:

mylist %>%
  map(~dmap_at(.x, "Date", as.Date))

但既然我们现在有mutate_atmutate_all等朋友,建议用他们代替dmapdmap_at

数据

df <- data.frame(Date = seq.POSIXt(Sys.time(), Sys.time() + hours(24), by = "hour"),
                 useless = "ignore me")
df2 <- data.frame(Date = seq.POSIXt(Sys.time(), Sys.time() + hours(1), by = "min"),
                  useless = "ignore me")
mylist <- list(df,df2)