#r
#r
Вопрос:
Я хочу создать цикл, который считывает определенный столбец (скажем, pH) в каталоге из 60 csv-файлов и записывает эти столбцы в csv-файл рядом друг с другом в порядке расположения файлов в каталоге.
directory <- "C:/"
file_name <- list.files(directory, pattern = ".csv")
files.to.read <- paste(directory, file_name, sep="/")
for (i in 1:length(files.to.read)) {
dta <- read.csv(files.to.read[i], header=TRUE)
x<-dta$pH_
}
Как я могу закодировать это, чтобы получить csv-файл с 60 столбцами по x рядом друг с другом. Обратите внимание, что количество строк необязательно равно во всех файлах, поэтому, когда я их связываю, это выдает ошибку. Заранее благодарю вас.
Ответ №1:
directory <- "C:/"
file_name <- list.files(directory, pattern = ".csv")
files.to.read <- paste(directory, file_name, sep="/")
x<-list()
Я бы предложил сохранить ваши данные из ваших CSV-файлов в виде списка:
for (i in 1:length(files.to.read)) {
dta <- read.csv(files.to.read[i], header=TRUE)
x[[i]]<-dta$pH
}
Создайте нулевую переменную для хранения длин каждого набора данных pH
ListLength<-NULL
for (i in 1:length(x)){
ListLength<-c(ListLength, length(x[[i]]))
}
Затем создайте другую переменную, чтобы определить, насколько коротким будет каждый столбец из самого длинного набора данных pH. Вызовите этот ManyNAs
ManyNAs<-max(ListLength)-ListLength
Создайте нулевой фрейм данных, содержащий столько строк, сколько ваш самый длинный набор данных pH.
OutputDF<-data.frame(matrix(NA, nrow = max(ListLength), ncol = length(file_name)))
Затем добавьте дополнительный NAs, чтобы сделать dataframe удобным.
for (i in 1:length(x)){
OutputDF[,i]<-c(x[[i]],rep(NA, ManyNAs[i]))
}
write.csv(OutputDF, "OutputDF.csv")
Если вы действительно не хотите, чтобы NAs был в вашем конечном CSV-файле, вы можете сделать это:
for (i in 1:length(x)){
OutputDF[,i]<-c(x[[i]],rep("",ManyNAs[i]))
}
Комментарии:
1. Спасибо вам миллион. Я действительно ценю это. У меня это сработало очень хорошо. Приветствия.
2. Рад это сделать. Это своего рода забавная головоломка. Я бы также рекомендовал называть ваши столбцы на основе файла, из которого они были получены, на всякий случай. Быстрый и грязный способ — это
colnames(OutputDF)<-c(file_name)
3. Или для еще более чистого имени столбца без .csv в конце вы можете сделать:
NewColumns<-sapply(file_name, function(x) substr(x, 1, nchar(x)-4))
и затем:colnames(OutputDF)<-c(NewColumns)
4. Я сделал это, и это выглядит именно так, как я хотел. О боже, я много боролся с этим. Я новичок в R work. Большое спасибо, чувак.
5. Может быть немного сложно набрать скорость, но продолжайте в том же духе. И никогда не бойтесь публиковать здесь. Я бы также рекомендовал это: coursera.org/learn/r-programming