добавить счетчик для lapply (do.call) - R - PullRequest
1 голос
/ 27 мая 2019

У меня есть файл, который включает в себя много папок.Я написал следующий код, чтобы получить адрес всех файлов, импортировать их в R и связать их, что работает хорошо.Проблема в том, что некоторые файлы имеют разное количество столбцов, что привело к отображению ошибки.Мой вопрос: как добавить счетчик в третью строку моего кода?Я в основном хочу проверить, когда мой счетчик останавливается, а затем я вручную отбрасываю этот файл, у которого количество столбцов отличается от других.Спасибо

file_names <- list.files(path="D:/ABCDE", recursive=TRUE)
setwd("D:/ ABCDE ") 
all_dta <- do.call(rbind, lapply(file_names, function(x) read.csv(file=x,header = FALSE))) 

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Более простое решение - изменить вызов, чтобы пропустить первую строку, и просто взять все файлы с помощью dplyr :: bind_rows ()

file_names <- list.files(path="D:/ABCDE", recursive=TRUE)
setwd("D:/ ABCDE ") 
all_dta <- do.call(dplyr::bind_rows, lapply(file_names, function(x) read.table(file=x,header = FALSE, sep = ',', skip = 1)))

Единственное, что вам нужно установитьимена столбцов.Вы можете либо прочитать одну строку, чтобы получить имена, либо сделать это вручную, если столбцов не много.

0 голосов
/ 27 мая 2019

Чтобы добавить счетчик к lapply Я бы просто сделал:

file_names <- list.files(path="D:/ABCDE", recursive=TRUE)
idx=1:length(filenames) #this will server as your 'counter'
lapply(idx, function(i) {print(file_names[i]); read.csv(file=file_names[i],header = FALSE)}) # this will print the file and when the loop stops you'll see the file that is faulty

Однако в качестве другого решения - чтобы узнать, какие файлы неисправны и пропустить их естественным путем - я бы сделал:

wanted=c()
for(f in file_names){
    first_line=system(paste0('head -n 1',f),intern=T) # sends prompt to command line to print first line of files. intern=T means one can set this to a variable
if(nchar(first_line > quota)){ #set quota to provide threshold for a number of columns
     wanted=c(wanted,f)
}
}

Вы можете сделать то же самое с sapply.

А потом:

all_dta <- do.call(rbind, lapply(wanted, function(x) read.csv(file=x,header = FALSE))) 

И если вы хотите знать, какие файлы неисправны (то есть, какие не содержат достаточного количества столбцов). Просто найдите файлы, у которых количество столбцов меньше квоты:

unwanted=c()
for(f in file_names){
    first_line=system(paste0('head -n 1',f),intern=T) # sends prompt to command line to print first line of files. intern=T means one can set this to a variable
if(nchar(first_line < quota)){ 
     unwanted=c(unwanted,f)
}
}
...