在csv中沿着行计算R中的岛屿

时间:2015-06-05 01:09:34

标签: r csv gaps-and-islands

我之前问了这个问题,弗兰克回答了here。原始问题:

  

我想在.csv中沿着行计算岛屿。我说" islands"   表示.csv行上的连续非空条目。如果有   连续三个非空白条目,我想要计算   作为一个岛屿。连续少于三个连续条目的任何内容   计为1"非岛"。然后我想将输出写入a   数据帧:

我稍微改变了输入.csv现在包括多个岛/间隙,这样行不仅仅是一个"岛"行或"非岛"行。有没有人有任何建议?

输入.csv:

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

所需的数据帧输出:

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

1 个答案:

答案 0 :(得分:1)

添加上一个问题的代码,稍加修改即可获得nonisland

# sample data
df <- read.csv(text="
,,,,,,,,,,,,,
Michael,,,1,1,1,,,,1,,,,
Peter,,,,1,1,,,,,,,,,
John,,,,,1,,,,,,,,,
Erin,,,,,1,1,,,,1,1,,,")

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

output$nonisland <- sapply(apply(df, 1, rle), 
                      function(x) sum(x$lengths[!is.na(x$values)] < 3))

names(output) <- c("island", "names", "nonisland")

#  values   names nonisland
#1      1 Michael         1
#2      0   Peter         1
#3      0    John         1
#4      0    Erin         2