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

jsg*_*483 8 r purrr tidyverse

仍然习惯于purrr,我有一个我认为应该很容易的问题,但我不知道该怎么做.我想要做的就是将下面的日期时间转换为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(?????)
Run Code Online (Sandbox Code Playgroud)

Tho*_*s K 10

实现目标的规范方法是结合map一些动词dplyr,例如mutate_at.目前purrr仍然具有该功能dmap_at,但purrr将来会被删除.

因此,您将map覆盖列表,然后使用以下命令修改日期列mutate_at:

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

mylist %>%
  map(~mutate_at(.x, "Date", as.Date))
Run Code Online (Sandbox Code Playgroud)

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

mylist %>%
  at_depth(1, ~mutate_at(.x, "Date", as.Date))
Run Code Online (Sandbox Code Playgroud)

最初的方法purrr是使用dmap_at:

mylist %>%
  map(~dmap_at(.x, "Date", as.Date))
Run Code Online (Sandbox Code Playgroud)

但是,因为我们现在有mutate_atmutate_all朋友,建议,而不是使用它们dmap,dmap_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)
Run Code Online (Sandbox Code Playgroud)


Sim*_*son 6

您可以map()mutate()dplyr包(也是tidyverse)结合使用.map()可用于mutate()在列表中应用每个数据框.mutate()可以申请as.Date()Date专栏.你这样写:

map(mylist, mutate, Date = as.Date(Date))
Run Code Online (Sandbox Code Playgroud)

这条线说:

  • map()/将mutate()函数应用于每个对象mylist
  • 每次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))
Run Code Online (Sandbox Code Playgroud)