подсчет островов в 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,

person agrobins    schedule 04.06.2015    source источник


Ответы (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 будет уместно.

person Jota    schedule 04.06.2015
comment
спасибо Фрэнк! Вы правы, мне нужно преобразовать все непустые записи в одно и то же значение. однако это заменяет записи имен на NA (без Майкла, Джона, Питера). Есть ли этому решение? - person agrobins; 05.06.2015
comment
Если вы предоставите dput ваших данных (например, dput(df)), которые показывают эту проблему, я смогу понять, что вы имеете в виду. Тем не менее, не видя, о чем вы говорите, я бы предположил, что вы должны преобразовать столбец имен в имена строк либо при импорте (см. ?read.csv и аргумент row.names), либо после. - person Jota; 05.06.2015
comment
понял это из справочной страницы read.csv. большое спасибо, это было очень полезно! - person agrobins; 05.06.2015