重命名列表中的名称,文件名不带 R 中的“.csv”

Rename names from a list with file names without the ".csv" in R

我有一个这样的文件列表:

> list_files
[[1]]
[1] "25.csv"

[[2]]
[1] "21.csv"

[[3]]
[1] "23.csv"

[[4]]
[1] "24.csv"

[[5]]
[1] "27.csv"

当我应用这个时:

  for (i in seq_along(list_files)) {
    df<-read.csv(list_files[[i]], sep="", stringsAsFactors=FALSE)
    time_series <- as.xts(df$SMS, order.by =as.POSIXct(df$TIME))
    final_list[[i]] <- time_series
  }
  final_list
}

我的 final_list 没有像 25,21,23 这样的用户 ID 的文件名...我该如何解决这个问题?

如果您想为添加到列表中的内容分配名称,您应该分配给字符串名称而不是 i,这是一个数字迭代器。对于文件名:

final_list[[list_files[[i]]]] <- time_series

对于迭代器:

final_list[[as.character(i)]] <- time_series

对于文件名中的数字,您必须在句点上拆分字符串并提取第一个元素:

final_list[[ strsplit(list_files[[i]],'[.]')[[1]][1] ]] <- time_series

根据您的评论,我认为您想要的完整表格是:

final_list<-list()
for (i in list_files) {
  df<-read.csv(i, sep="", stringsAsFactors=FALSE)
  time_series <- as.xts(df$SMS, order.by =as.POSIXct(df$TIME))
  final_list[ strsplit(i,'[.]')[[1]][1] ] <- time_series
}
final_list

请注意,我们实际上是在遍历列表本身(即 '25.csv'、'24.csv',而不是遍历 seq_along 所做的 1:length(list_files) ...)

最终编辑:正如我回答的第二部分,您应该 for i in info$user 迭代用户 ID。您对 seq_along 的使用是通过与实际 ID 不对应的用户数量生成数字 1。

我将两个代码块修改为一个:

time_series_list<-list()
for(id in as.character(info$user)){
    if(file.exists(paste0(id,".csv"))){
      file <- dir(path = setwd(path_list), pattern=paste0(id))
      df<-read.csv(file, sep="", stringsAsFactors=FALSE)
      time_series <- as.xts(df$SMS, order.by =as.POSIXct(df$TIME))
      time_series_list[ id ] <- time_series
    }else{
      print(paste("File for id",id,"doesn't exist")
    }
  }