[英]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.