Считая острова в R csv

Я хотел бы посчитать острова вдоль рядов в.csv. Я говорю "острова", что означает последовательные непустые записи в строках.csv. Если в строке три непустые записи, я бы хотел, чтобы это считалось за 1 остров. Все, что меньше трех последовательных записей подряд, считается как 1 "не остров". Затем я хотел бы записать вывод в фрейм данных:

Name,,,,,,,,,,,,,
Michael,,,1,1,1,,,,,,,,
Peter,,,,1,1,,,,,,,,,
John,,,,,1,,,,,,,,,

Требуемый вывод данных:

Name,island,nonisland,
Michael,1,0,
Peter,0,1,
John,0,1,

1 ответ

Решение

Вы могли бы использовать rle как это;

output <- stack(sapply(apply(df, 1, rle), function(x) sum(x$lengths >= 3)))
names(output) <- c("island", "name")

output$nonisland <- 0
output$nonisland[output$island == 0] <- 1
#  island    name nonisland
#1      1 Michael         0
#2      0   Peter         1
#3      0    John         1

Здесь вы бежите rle через строки вашего фрейма данных. Затем просмотрите и сложите вхождения, когда вы найдете длины 3 или более.

Обратите внимание, что в этом решении предполагается, что все острова состоят из одного и того же (т.е. все 1, как в вашем примере). Если это не так, вам нужно преобразовать все непустые записи в одно и то же, выполнив что-то вроде этого: df[!is.na(df)] <- 1 до rle будет уместно.

Другие вопросы по тегам