计算R csv中的岛屿

时间:2015-06-04 21:27:30

标签: r csv gaps-and-islands

我想在.csv中沿着行计算岛屿。我说“islands”意味着.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 个答案:

答案 0 :(得分:3)

您可以像这样使用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