重命名列表中的名称,文件名不带 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")
}
}
我有一个这样的文件列表:
> 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")
}
}