繁体   English   中英

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

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

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

日期 价格
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 与自定义 function 一起使用,它将字符“日期”列转换为日期 class。但是,lapply function 没有给我重新格式化的日期列。 我的简单代码如下:

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) 时,它仍然显示为“字符”而不是日期。 另一方面,如果我 go 手动为每个 dataframe 进行此转换,它可以工作,但我不想手动 go 超过 100 个数据帧。 那是,

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

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

你错过了返回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 按值而不是引用/指针传递参数。 因此原始对象没有被修改。 要修改原始对象,您需要调用使用名称和列表的环境。

命名列表中的元素:

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)

你现在可以查看你原来的dataframe中日期栏的class:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM