Подтвердить что ты не робот

Ошибка в файле (файл, "rt" ): неверный аргумент "описание" в программе complete.cases

Я пишу функцию R, которая читает каталог, полный файлов, и сообщает количество полностью наблюдаемых случаев в каждом файле данных. Функция возвращает кадр данных, где первый столбец является именем файла, а второй столбец - числом полных случаев.

например,

id nobs
1  108
2  345
...
etc

Вот функция, которую я написал:

complete <- function(directory, id = 1:332) {

  for(i in 1:332) {
    path<-paste(directory,"/",id,".csv",sep="")
    mydata<-read.csv(path)
    #nobs<-nrow(na.omit(mydata))
    nobs<-sum(complete.cases(mydata))
    i<-i+1
  }

  completedata<-c(id,nobs)
}

Я выполняю функцию:

complete("specdata",id=1:332)

но я получаю эту ошибку:

Error in file(file, "rt") : invalid 'description' argument

Я также попробовал функцию traceback() для отладки моего кода, и он дает этот результат:

traceback()
# 4: file(file, "rt") at #6
# 3: read.table(file = file, header = header, sep = sep, quote = quote, 
#    dec = dec, fill = fill, comment.char = comment.char, ...) at #6
# 2: read.csv(path) at #6
# 1: complete("specdata", id = 1:332)
4b9b3361

Ответ 1

Трудно сказать без полностью воспроизводимого примера, но я подозреваю, что ваша проблема заключается в этой строке:

path<-paste(directory,"/",id,".csv",sep="")

id вот вектор, поэтому путь становится вектором символьных строк, а когда вы вызываете read.csv, вы передаете ему все пути одновременно, а не только один. Попробуйте изменить приведенную выше строку на

path<-paste(directory,"/",id[i],".csv",sep="")

и посмотрите, работает ли это.

Ответ 2

Кажется, у вас есть проблема с файлом. Вы передаете полный вектор id = c (1: 332) в имя пути к файлу. Если ваши файлы называются 1.csv, 2.csv, 3.csv и т.д.
Вы можете изменить эту строку:

path<-paste(directory,"/",id,".csv",sep="")

to

path<-paste(directory,"/",i,".csv",sep="")

и оставьте или переделайте идентификатор ввода вашей функции.

Ответ 3

Вместо того, чтобы использовать for для чтения данных, вы можете попробовать sapply. Например

mydata <- sapply(path, read.csv).

Так как path - вектор, sapply будет итерировать вектор и применить к нему read.csv. Следовательно, цикл for не понадобится, и ваш код будет намного чище.

Оттуда у вас будет matrix, который каждый из ваших файлов и их соответствующая информация, из которой вы можете извлечь наблюдения.

Чтобы найти наблюдения, вы можете сделать mydata[2,1][[1]]. Помните, что строки будут вашими факторами, а ваши столбцы будут вашими файлами.

Ответ 4

Я работаю над точной проблемой.. имена файлов в каталоге "specdata" называются с 001.csv и 002.csv.... 099.csv полностью в файл 332.csv однако, когда вы вызываете id = 1, ваше имя файла становится 1.csv, которого нет в каталоге. попробуйте использовать эту функцию, чтобы получить путь к каждому файлу id.

filepaths <- function (id){
    allfiles = list.files(getwd())
    file.path(getwd(), allfiles[id])
}

Ответ 5

У меня была эта проблема, потому что я пытался запустить цикл for в отношении кадра данных, а не вектора:

  ids <- th[th$nobs > threshold,]
  for(i in ids) {

вот что выглядит переменная "ids":

     id nobs
2     2 1041
154 154 1095
248 248 1005

должен был быть:

  ids <- th[th$nobs > threshold,]
  for(i in ids$id) {

Ответ 6

Я встретил ту же проблему в этом предложении:

Browse[2]> read.csv(list.files(".", "XCMS-annotated-diffreport--.*csv$"), row.names = 1)
Error in file(file, "rt") : invalid 'description' argument

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

Browse[2]> list.files(".", "XCMS-annotated-diffreport--.*csv$")
[1] "XCMS-annotated-diffreport--1-vs-2-Y.csv" "XCMS-annotated-diffreport--1-vs-2.csv"  

Когда я удаляю один файл, он снова работает.