Как мне найти (и вывести) позицию первого значения 1 и последнего значения 1 по строке в нескольких CSV-файлах одновременно? - PullRequest
1 голос
/ 16 октября 2019

Я пытаюсь вывести позицию первого значения 1 и последнего значения 1 по строке в количестве двоичных матриц, сохраненных в нескольких файлах CSV одновременно?

У меня есть следующие использованные длячитать все csv-файлы с табуляцией в рабочем каталоге ...

csvs <- list.files(pattern="*.csv")
files <- lapply(csvs, read.delim)

Прежде всего, я пытался ...

first_1 <- sapply(files, function(x) min(which(x == 1)))

Но это мне не даноправильный ответ. Например, в CSV-файле с двоичной матрицей

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   1   1   1   1   1   1   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   1   1   1   0   0   1   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   1   1   1   1   1   0   0   0   1   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   1   0   1   1   0   0   0   0   0   0

0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   1   1   1   1   0   0   0   0   0

0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0

0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0

0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0

0   0   0   0   0   0   0   1   0   0   0   1   1   1   1   0   0   0   1   0   0   0   0   0   0

0   0   0   0   0   0   0   1   0   0   0   1   0   0   0   1   0   1   1   0   0   0   0   0   0

0   0   0   0   0   0   0   1   0   0   0   1   0   0   0   1   1   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   1   1   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

саппло выводит 152, когда оно должно выводить 135. Кто-то может помочь?

50 x 50 фрейм данных

1 Ответ

0 голосов
/ 17 октября 2019

Вы читаете данные и создаете фреймы данных, а не матрицы. Это может повлиять на ваши результаты в дальнейшем, но не здесь, поскольку фреймы данных и матрицы обрабатываются по R по столбцам, поэтому вы получаете правильный ответ на свой вопрос, а не тот, который вам нужен. Самый простой подход - использовать t(). Я создал фрейм данных из вашего примера с именем dta:

min(which(dta == 1))
# [1] 159
min(which(t(dta) == 1))
# [1] 135

Большие матрицы работают просто отлично (ответ на комментарий ниже). Сначала создайте воспроизводимую матрицу.

dta <- matrix(0, 50, 50)
ones <- structure(c(25L, 22L, 27L, 9L, 31L, 38L, 32L, 2L, 9L, 50L, 7L, 
19L, 40L, 47L, 26L, 1L, 47L, 34L, 16L, 23L, 39L, 3L, 30L, 50L, 
11L, 3L, 41L, 28L, 22L, 15L, 50L, 31L, 28L, 38L, 16L, 25L, 14L, 
22L, 12L, 11L, 40L, 44L, 1L, 38L, 7L, 39L, 1L, 39L, 33L, 50L, 
16L, 15L, 4L, 37L, 25L, 25L, 18L, 9L, 21L, 32L, 47L, 49L, 17L, 
48L, 26L, 7L, 4L, 47L, 16L, 11L, 35L, 17L, 25L, 23L, 24L, 4L, 
12L, 23L, 8L, 38L, 19L, 32L, 8L, 35L, 1L, 48L, 42L, 45L, 43L, 
45L, 30L, 41L, 5L, 5L, 49L, 37L, 19L, 20L, 48L, 43L), .Dim = c(50L, 
2L), .Dimnames = list(NULL, c("row", "col")))
dta[ones] <- 1
dim(dta)  # Show the number of rows and columns
# [1] 50 50

Вы можете просмотреть матрицу с помощью View(dta), прежде чем использовать следующий код:

min(which(dta == 1))  # By columns
# [1] 16
min(which(t(dta) == 1))  # By rows
# [1] 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...