重命名具有文件名的列表中的名称,而不使用R中的“.csv”

时间:2018-02-22 18:45:19

标签: r list names

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

> 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的文件名...我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果要为添加到列表中的内容指定名称,则应该为字符串名称而不是作为数字迭代器的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'......)1:length(list_files)正在进行的seq_along。 p>

最终编辑:与我的答案的第二部分一样,您应该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")
    }
  }