Ошибка в drop && !has.j: недопустимый тип «x» в «x && y» при использовании суммы (complete.cases) Windows7 R3.2.1

Я очень новичок в программировании, как в R, так и вообще.

Вот моя цель для написания этого скрипта:

  1. У меня есть 332 CSV-файла. Я хочу: «Напишите функцию, которая считывает каталог, полный файлов, и сообщает о количестве полностью наблюдаемых случаев в каждом файле данных. Функция должна возвращать фрейм данных, в котором первый столбец — это имя файла, а второй столбец — количество полных случаев».

  2. Схема функции выглядит следующим образом:

    Complete ‹- function(directory, id = 1:332) { ## 'directory' - это вектор символов длины 1, указывающий ## расположение файлов CSV

        ## 'id' is an integer vector indicating the monitor ID numbers
        ## to be used
    
        ## Return a data frame of the form:
        ## id nobs
        ## 1  117
        ## 2  1041
        ## ...
        ## where 'id' is the monitor ID number and 'nobs' is the
        ## number of complete cases
    

    }

Пример вывода будет выглядеть так:

source("complete.R")
complete("specdata", 1)
##   id nobs
## 1  1  117

complete("specdata", c(2, 4, 8, 10, 12))
##   id nobs
## 1  2 1041
## 2  4  474
## 3  8  192
## 4 10  148
## 5 12   96
  1. Мой скрипт пока выглядит так:

setwd("C:/users/beachlb/Desktop/R_Programming/specdata") #это локальный каталог на моем компьютере, где хранятся все 332 файла csv

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

>files_list <- list.files(directory, full.names=TRUE) #creates a list of files from within the specified directory

>dat <- data.frame() #creates an empty data frame that we can use to add data to

>for (i in id) {

>dat <- rbind(dat, read.csv(files_list[i]))  #loops through the 332 csv files, rbinding them together into one data frame called dat
  }

>dat$nobs <- sum(complete.cases(dat)) #add the column nobs to dat, populated with number of rows of complete cases in the dataframe

>dat_subset <- dat[which(dat[, "ID"] %in% id),] #subsets dat so that only the desired cases are included in output when function is run

>dat_subset[, "ID", "nobs"] #prints all rows of the desired data frame for the named columns}
  1. Когда я запускаю свою функцию как есть, я получаю эту ошибку: «Ошибка в drop && !has.j: недопустимый тип «x» в «x && y». Я не уверен, что выдает мне эту ошибку. Я был бы признателен за любые советы о том, что может быть причиной этой ошибки и как я могу работать, чтобы решить ее. Указание мне на литературу, которую я мог бы прочитать, чтобы изучить это, и / или учебные пособия, которые помогут мне укрепить навыки кодирования, необходимые для предотвращения этой ошибки, также будут оценены.

  2. Предисловие: я не уверен, что должен задавать этот вопрос в отдельной ветке. Прямо сейчас моя функция написана для заполнения общего количества полных случаев для всех строк (для всех 332 файлов), вместо этого специально подсчитать количество полных случаев для данного идентификатора монитора и поместить его в столбцы только для этого идентификатора. (Обратите внимание, что каждый файл назван в честь идентификатора монитора и содержит только наблюдения из этого монитора, например, 001.csv = выходные данные монитора 1, 002.csv = выходные данные монитора 2). Поэтому я надеюсь, что кто-то поможет указать мне ресурс для подмножества dat, чтобы при заполнении столбца nobs каждая строка в столбце nobs давала количество полных случаев для каждого номера идентификатора.


person MSUTangles1984    schedule 18.08.2015    source источник
comment
Вы получаете ошибку из-за неуместной запятой dat_subset[, "ID", "nobs"]   -  person Pierre L    schedule 18.08.2015


Ответы (3)


complete <- function(directory, id = 1:332) {
  files_list <- list.files(directory, full.names=TRUE)
  nobs <- c()
  for (i in id) {
    dat <- read.csv(files_list[i])
    nobs <- c(nobs, sum(complete.cases(dat)))
  }
  data.frame(id,nobs)
}

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

Тест

complete("specdata", c(2,4,8,10,12))
  id nobs
1  2 1041
2  4  474
3  8  192
4 10  148
5 12   96
person Pierre L    schedule 18.08.2015
comment
Я думал о попытке написать цикл так, чтобы dat содержал только файлы, которые будут указаны при запуске функции - это определенно выглядит как более простое решение. Кроме того, я не был уверен в других методах определения того, что будет заполняться в столбце. Как правило, c(имя столбца, функция(данные)) выполняет это. Спасибо за помощь в обучении. - person MSUTangles1984; 18.08.2015

Я понятия не имею, что вызывает ошибку, но я бы рекомендовал избегать процесса, который приводит к ней. Ваша ситуация значительно выиграла бы от векторизации. Я не думаю, что этот код будет работать из коробки, но он должен быть на правильном пути:

#* Get the file names of the CSV files to read
files <- list.files(getwd(), pattern = "\\d{3}[.]csv$")

#* Read in all of the CSV files into a list of data frames
DataFrames <- lapply(files, read.csv)

#* Calculate the number of complete cases in each file
CompleteCases <- vapply(DataFrames, 
                        function(df) sum(complete.cases(df)),
                        numeric(1))

#* Produce a data frame with the file name, and the number of complete cases in the file.
data.frame(file = basename(files),
           nobs = CompleteCases)
person Benjamin    schedule 18.08.2015
comment
Спасибо, что написали это предложение. Я все еще изучаю, как использовать функции применения. Мне было очень полезно увидеть, как эти функции можно использовать для чтения данных и применения функции к фреймам данных. - person MSUTangles1984; 18.08.2015

Вы делаете глупую ошибку в последней строке

dat_subset[, "ID", "nobs"] # incorrect code and will generate the error
#Error in drop && length(x) == 1L : invalid 'x' type in 'x && y'

base R не допускает подмножества внутри [ ] со списком имен столбцов, разделенных запятыми. Вы должны преобразовать это в вектор символов и передать как один параметр следующим образом:

 dat_subset[, c("ID", "nobs")]

выше - правильный способ подмножества в нескольких столбцах.

person Lazarus Thurston    schedule 22.09.2017