Считая острова в 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
будет уместно.