You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在R语言循环中批量修改多个同结构数据框的列类型

解决循环中修改CSV文件date列类型的错误问题

你遇到的错误根源很明确:循环里写的price.i只是一个固定的字符串字面量,R不会自动把它解析成price.1price.2这类动态生成的变量名,自然会找不到对应的对象。下面给你两种可行的解决方案:

方法一:调整原有循环逻辑

你可以在读取数据的同时直接修改date列,再赋值到目标变量,这样就绕开了动态引用变量名的问题:

mydir <- "~/Desktop//Data/Downloads"
myfiles = list.files(path=mydir, pattern="*.csv", full.names=TRUE)

for (i in 1:length(myfiles)) {
  nam <- paste("price",i, sep = ".")
  # 先读取数据并立即转换date列类型
  data <- read.csv(file = myfiles[i], stringsAsFactors = FALSE)
  data$date <- as.Date(data$date)
  # 将处理好的数据赋值到对应变量
  assign(nam, data)
}

如果一定要保留先赋值再修改的流程,也可以用get()获取变量内容,修改后再用assign()存回去:

for (i in 1:length(myfiles)) {
  nam <- paste("price",i, sep = ".")
  assign(nam, read.csv(file = myfiles[i] , stringsAsFactors = FALSE))
  # 获取当前变量的数据集
  current_data <- get(nam)
  # 修改date列类型
  current_data$date <- as.Date(current_data$date)
  # 把修改后的数据集重新赋值
  assign(nam, current_data)
}

方法二:更推荐的列表存储方案

在R里创建大量独立变量(比如price.1price.2)并不是最佳实践,会让全局环境变得杂乱,也不利于后续批量操作。更规范的方式是把所有数据存在一个列表里:

mydir <- "~/Desktop//Data/Downloads"
myfiles <- list.files(path=mydir, pattern="*.csv", full.names=TRUE)

# 用lapply批量读取并处理所有CSV文件
price_list <- lapply(myfiles, function(file_path) {
  df <- read.csv(file_path, stringsAsFactors = FALSE)
  df$date <- as.Date(df$date)
  return(df)
})

# 给列表元素命名(用文件名去掉后缀,方便后续按名访问)
names(price_list) <- tools::file_path_sans_ext(basename(myfiles))

# 访问单个文件数据:比如第一个文件用price_list[[1]],或者按文件名price_list$"你的文件名"

验证结果

不管用哪种方法,你都可以通过str(price.1)(方法一)或str(price_list[[1]])(方法二)查看结果,date列都会变成你期望的Date类型:

'data.frame': 2195 obs. of 3 variables:
symbol : chr "CAR" "CAR" "CAR"
date : Date, format: "2020-01-02" "2020-01-03" "2020-01-06"
adjusted : num 16.5 16.6 16.7

内容的提问来源于stack exchange,提问作者Federico

火山引擎 最新活动