спасибо огромное Максим и gamm!!!
c вашей помощью удалось мне написать нужную функцию. Я поясню цель, чтобы было понятно зачем мне нужны такие операции хитрые с именами - может быть покритикуете мой подход и алгоритм? буду очень благодарна
Есть у меня N-папок. В каждой папке по 19 csv файлов (в каждом 4 столбца, список файлов у меня назван variab).
Мне нужно пройтись по всем папкам и для каждой сделать отдельный список (list) в R
Список должен состоять из 38 векторов - по два вектора из каждого csv файла (там еще кое-какой расчет по колонкам - но это не так важно). При этом имена векторов списка должны соответствовать названиям csv файлов, а имя списка - должно соответствать имени папки.
То есть структура готового набора данных в результате такая:
species1.list
$temp_v
$temp_n
$prec_v
$prec_n
species2.list
$temp_v
$temp_n
$prec_v
$prec_n
species3.list
$temp_v
$temp_n
$prec_v
$prec_n
вот мой код (он небольшой, просто с комментариями вышел длинным). Попробую его еще переписать по алгоритму который предложил gamm - то есть сначала сделать вектор имен для списка, и сразу присваивать в момент расчета. Но может быть заметите еще какие-то проблемы\ньюансы?
во вложении - тестовый набор данных со скриптом
Код: Выделить всё
# function to import csv files, calculate additional weights and cumsum and combine into lists
readcsv<-function(varlist, specieslist){
species<-read.table("species.lst",header=FALSE)
species$V1 <- as.character(species$V1)
variab<-read.table("var.lst",header=FALSE)
variab$V1 <- as.character(variab$V1)
for (i in 1:nrow(species)){
data_list = list()
name_list = list()
for (j in 1:nrow(variab)) {
#import $species$var.csv
afile<-paste(species$V1[i],variab$V1[j],".csv",sep="")
adata<-read.csv(paste(species$V1[i],"\\",afile,sep=""),header=FALSE)
#calculate column weight - percentage of cells occupied by particular value
V5<-unlist(lapply(adata$V2, function(x) (100*x)/sum(adata$V2)))
adata<-cbind(adata,V5)
#normalized values
V6<-(adata$V4/adata$V5)
adata<-cbind(adata,V6)
#cumsum
V7<-cumsum(adata$V6)
adata<-cbind(adata,V7)
#export variable into list
var_t<-paste(variab$V1[j],"_v", sep="")
data_list = c(data_list,data.frame(adata$V7))
names(data_list)[j] = var_t
#export variable code into list
var_tn<-paste(variab$V1[j],"_n", sep="")
name_list = c(name_list,data.frame(adata$V2))
names(name_list)[j] = var_tn
}
#get species name
unique_list_name<-paste(species$V1[i],"_out", sep="")
#create temporal combined list
tmp<-append(data_list,name_list)
#assign data to the unique name
assign(unique_list_name,tmp)
#remove all temporal values
rm(data_list)
rm(name_list)
rm(tmp)
rm(unique_list_name)
}
}