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

时间:2017-04-04 22:03:22

标签: r 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(?????)

2 个答案:

答案 0 :(得分:10)

实现目标的规范方法是将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_depthat_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)

答案 1 :(得分:5)

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

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

这句话说:

  • 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))