在 R 中的多个数据框的特定列上应用自定义函数

Applying a custom function on a particular column of multiple dataframes in R

我有多个数据框(df1、df2、df3、df4、df5),每个数据框都有相同的两列:日期,其中日期(例如 2020-11-12)作为字符,价格列作为数字.例如,df1 看起来像这样: df1

Date Price
2020-11-12 29.75
2020-11-13 29.95
2020-11-14 30.72
2020-11-15 32.83
2020-11-16 33.14

我正在尝试将 lapply 与自定义函数结合使用,将字符“日期”列转换为日期 class。但是,lapply 函数没有给我重新格式化的日期列。我的简单代码如下:

df.list <- list(df1, df2, df3, df4, df5)  # create a list of dataframes

# create a custom function to change the class of date column
date_con <- function(x) {
             x$date <- as.Date(x$date, format="%Y-%m-%d")}

当我使用

lapply(df.list, date_con)

日期列仍然保留为字符。例如,当我检查 class(df$date) 时,它仍然显示为“字符”而不是日期。另一方面,如果我手动为每个数据帧进行此转换,它会起作用,但我不想手动处理超过 100 个数据帧。也就是说,

df1$date <- as.Date(df1$date, format="%Y-%m-%d") 

有效,但显然效率不高,我相信有办法实现这一目标。那么,如何使用 lapply 或其他方法有效地将字符日期列转换为日期 class 列以用于大量数据帧?

你错过了 return x

df_list <- lapply(df_list, \(x) {x$date <- as.Date(x$date);x})
str(df_list)
# List of 3
# $ :'data.frame':  6 obs. of  2 variables:
#   ..$ date : Date[1:6], format: "2020-11-12" ...
# ..$ price: num [1:6] 29.8 29.9 30 30.4 30.2 ...
# $ :'data.frame':  6 obs. of  2 variables:
#   ..$ date : Date[1:6], format: "2020-11-12" ...
# ..$ price: num [1:6] 29.8 29.9 30 30.4 30.2 ...
# $ :'data.frame':  6 obs. of  2 variables:
#   ..$ date : Date[1:6], format: "2020-11-12" ...
# ..$ price: num [1:6] 29.8 29.9 30 30.4 30.2 ...

数据:

df_list <- list(structure(list(date = c("2020-11-12", "2020-11-13", "2020-11-14", 
"2020-11-15", "2020-11-16", "2020-11-17"), price = c(29.75, 29.94, 
29.97, 30.37, 30.23, 30.22)), class = "data.frame", row.names = c(NA, 
-6L)), structure(list(date = c("2020-11-12", "2020-11-13", "2020-11-14", 
"2020-11-15", "2020-11-16", "2020-11-17"), price = c(29.75, 29.94, 
29.97, 30.37, 30.23, 30.22)), class = "data.frame", row.names = c(NA, 
-6L)), structure(list(date = c("2020-11-12", "2020-11-13", "2020-11-14", 
"2020-11-15", "2020-11-16", "2020-11-17"), price = c(29.75, 29.94, 
29.97, 30.37, 30.23, 30.22)), class = "data.frame", row.names = c(NA, 
-6L)))

这里的问题是 R 按值而不是 reference/pointers 传递参数。因此原始对象没有被修改。修改原有对象,需要向环境调用名称和列表的使用。

命名列表中的元素:

df.list <- list(df1 = df1, df2 = df2, df3 = df3, df4 = df4, df5 = df5)

# function
date_con <- function(x) {
    x$date <- as.Date(x$date, format="%Y-%m-%d")
    x
}

现在运行

list2env(lapply(df.list, date_con),.GlobalEnv)

您现在可以检查原始数据框中日期列的 class:

class(df1$date)
[1] "Date"