R语言中用For循环批量修改多数据框列类型失效问题求助
问题描述
我从CSV文件导入了多个dataframe,它们都包含相同列名ActivityHour,该列导入后为character类型。我希望使用R语言lubridate包的mdy_hms()函数将其转换为日期时间类型。于是我将这些dataframe存入列表,通过for循环批量处理,避免重复编写代码。但运行循环后,在终端查看任意dataframe的ActivityHour列类型仍为character;有趣的是,在for循环内调用class()函数时,该列类型显示为POSIXct。
示例代码
library(lubridate) hourlyIntensities1 <- data.frame( Id = c(1,2,3,4), ActivityHour = c("3/12/2016 12:00:00 AM","3/12/2016 2:00:00 AM","3/12/2016 4:00:00 PM","3/13/2016 1:00:00 AM"), Intensity = c(2,5,3,9) ) hourlyIntensities2 <- data.frame( Id = c(1,2,3,4), ActivityHour = c("4/12/2016 12:00:00 AM","4/12/2016 2:00:00 AM","4/12/2016 4:00:00 PM","4/13/2016 1:00:00 AM"), Intensity = c(7,4,8,2) ) hourlySteps1 <- data.frame( Id = c(1,2,3,4), ActivityHour = c("3/12/2016 12:00:00 AM","3/12/2016 2:00:00 AM","3/12/2016 4:00:00 PM","3/13/2016 1:00:00 AM"), Steps = c(950, 784, 631, 982) ) hourlySteps2 <- data.frame( Id = c(1,2,3,4), ActivityHour = c("3/12/2016 12:00:00 AM","3/12/2016 2:00:00 AM","3/12/2016 4:00:00 PM","3/13/2016 1:00:00 AM"), Steps = c(740, 650, 875, 265) ) hourly <- list(hourlyIntensities1, hourlyIntensities2, hourlySteps1, hourlySteps2) for (df in hourly) { df$ActivityHour <- mdy_hms(df$ActivityHour) print(class(df$ActivityHour)) }
运行结果
循环内输出:
[1] "POSIXct" "POSIXt" [1] "POSIXct" "POSIXt" [1] "POSIXct" "POSIXt" [1] "POSIXct" "POSIXt"
查看原数据框列类型:
print(class(hourlyIntensities1$ActivityHour))
输出:
[1] "character"
问题原因
在R的for循环中,遍历列表时df是原数据框的副本,而非原对象的引用。循环内仅修改了副本的ActivityHour列,原数据框(如hourlyIntensities1)并未被改动,因此循环结束后查看原数据框的列类型仍为character。
解决方案
方法1:通过索引循环修改列表元素
直接通过列表的索引位置修改元素,改动会直接作用于列表中的数据框,之后可将处理后的数据框赋值回原变量:
library(lubridate) # 遍历列表索引,直接修改列表内的元素 for (i in seq_along(hourly)) { hourly[[i]]$ActivityHour <- mdy_hms(hourly[[i]]$ActivityHour) } # 验证修改结果 print(class(hourly[[1]]$ActivityHour)) # 输出 [1] "POSIXct" "POSIXt" # 将处理后的数据框放回原变量 hourlyIntensities1 <- hourly[[1]] hourlyIntensities2 <- hourly[[2]] hourlySteps1 <- hourly[[3]] hourlySteps2 <- hourly[[4]]
方法2:用lapply批量处理(更简洁)
lapply会自动遍历列表并返回处理后的新列表,代码更简洁高效:
library(lubridate) # 批量处理列表中的每个数据框 hourly_processed <- lapply(hourly, function(df) { df$ActivityHour <- mdy_hms(df$ActivityHour) return(df) }) # 验证结果 print(class(hourly_processed[[1]]$ActivityHour)) # 赋值回原变量 hourlyIntensities1 <- hourly_processed[[1]] hourlyIntensities2 <- hourly_processed[[2]] hourlySteps1 <- hourly_processed[[3]] hourlySteps2 <- hourly_processed[[4]]
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

