Ошибка получения: аргумент длины 0 при чтении в отдельных таблицах из нескольких CSV-файлов в цикле for - PullRequest
1 голос
/ 26 октября 2019

Ошибка в 1: nrow (csvs): аргумент длины 0 при чтении в отдельных таблицах из нескольких файлов CSV

Я пытаюсь выполнить следующий цикл for для отдельных таблиц, считанных из нескольких файлов CSV врабочий каталог. Но я продолжаю получать сообщение об ошибке «Ошибка в 1: nrow (csvs): аргумент длины 0». Это то, что я попробовал ниже ...

# Read all csvs from files path.
csv_files <- list.files(pattern="*.csv")
csvs <- lapply(csv_files, read.table)


count <- 0

for(x in 1:nrow(csvs) - 1) {
  for(y in 1:ncol(csvs)) {
    if((isTRUE(csvs[x,y] == 1)) && (isTRUE(csvs[x+1,y+1] == 0))) {
      count <- count + 1
    }
  }
}
count

Это ничего не выводит и показывает ошибку: аргумент длины 0. Любые предложения?

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

set.seed(99)
mat <- matrix(sample(c(0,1), 2500, prob=c(0.8,0.2), replace=TRUE), nrow=50) 

count <- 0

for(x in 1:nrow(mat) - 1) {
  for(y in 1:ncol(mat)) {
    if((isTRUE(mat[x,y] == 1)) {
      count <- count + 1
    }
  }
}
count

[1] 91

Я не могу понять, почему это работает для одной матрицы, а не для нескольких. Может кто-нибудь помочь, пожалуйста?

1 Ответ

1 голос
/ 26 октября 2019

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

yourfunction <- function (mat) {

for(x in 1:nrow(mat) - 1) {
  for(y in 1:ncol(mat)) {
    if(isTRUE(mat[x, y] == 1)) && (isTRUE(mat[x + 1, y] == 1))) {
      counter <- counter + 1
    }
  }
}
counter
}

lapply(csvs, yourfunction)

...