Ошибка в файле (файл, "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)
Ответы
Ответ 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"
Когда я удаляю один файл, он снова работает.