r - 在 R csv 中计算岛屿

标签 r csv gaps-and-islands

我想在 .csv 中沿行计算岛屿数量。我说的“岛屿”是指 .csv 行上的连续非空白条目。如果连续出现 3 个非空白条目,我希望将其计为 1 个岛屿。连续少于三个连续条目的任何内容都算作 1 个“非岛屿”。然后我想将输出写入数据帧:

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

所需的数据帧输出:

Name,island,nonisland,
Michael,1,0,
Peter,0,1,
John,0,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会比较合适。

关于r - 在 R csv 中计算岛屿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30654489/

相关文章:

r - 合并两个数据框并删除重复的列

r - 查找出现在一个表中但不在第二个表中的行号

shell - 创建一个 shell 脚本以在 mongodb 中自动导出 csv

python - 如何将 .csv 文件的内容解析为字典,同时始终跳过标题?

mysql - 如何在mySQL上找到不规则的增加

r - 如何将稀疏矩阵中的替换值设置为 NA 而不是 0?

python - 更改 csv.DictReader 类型中字典键的值

sql - 如何填补 Postgres 查询中的时间戳空白?

sql - 重叠时间间隔 : Select "all busy" periods

r - 在 R 包中添加引用信息