使用 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))
实现目标的规范方法是将 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))
您也可以使用 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_at
和mutate_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)
还在习惯咕噜声,我有一个问题我认为应该很简单,但我不知道该怎么做。我想要做的就是将下面的日期时间转换为 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(object, Date = as.Date(Date))
mutate()
函数
完整代码:
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))
实现目标的规范方法是将 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))
您也可以使用 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_at
和mutate_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)