我想在.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,
答案 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
。