【发布时间】:2020-10-25 12:41:59
【问题描述】:
假设我有以下数据:
structure(list(A = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2
), B = c(1, 2, 3, 4, 20, 5, 1, 2, 6, 3, 4, 5, 6, 7)), row.names = c(NA,
-14L), class = "data.frame")
我现在希望删除 B 的增量不为 1 的所有行,但 A 列开始新系列时除外。
我试图通过使用dplyr 来做到这一点:
filter(df, (diff(append(B,NA,after=0))==1 | B==1))
请注意,我追加是因为diff() 之后的向量比原始数据短 1。
这导致:
structure(list(A = c(1, 1, 1, 1, 2, 2, 2, 2, 2, 2), B = c(1,
2, 3, 4, 1, 2, 4, 5, 6, 7)), row.names = c(NA, -10L), class = "data.frame")
问题是因为我使用diff()来判断B列的增量是否始终为1,一旦数据出现错误,也会(错误地)将错误后的那一行视为错误。
有没有办法:
-
使用更合乎逻辑的方法来规避这个问题?
-
或者是否有可能使过滤器在删除一行后更新,以便 diff() 的逻辑是正确的。虽然我想如果可能的话,这会显着减慢命令的速度。
【问题讨论】:
-
为什么要使用结构来创建数据框,为什么不使用像
tibble( A = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2), B = c(1, 2, 3, 4, 20, 5, 1, 2, 6, 3, 4, 5, 6, 7))这样的小标题 -
确实简单一些,谢谢!我不太确定如何生成清晰的假数据,所以在 R 中手工制作,然后使用 dput。谢谢推荐!