Импорт аналогичного столбца (например. Столбец pH) из 60 csv-файлов с использованием цикла и создания матрицы.

#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