在 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"
我有多个数据框(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"