【问题标题】:Filtering out list of sequential values in R? [duplicate]过滤掉R中的顺序值列表? [复制]
【发布时间】:2020-07-21 00:36:33
【问题描述】:

我有一个小标题,叫做 zero_sum_ab。每个都用变量 ab_id 标识。我正在尝试隔离非顺序值...例如,请参见下面的 sn-p:

在图像中,您可以看到 ab_id 大多是非连续的。分散在整个数据中的是顺序值,例如突出显示的值:2015000110 和 2015000111。

我要做的是从整个数据集中的这些连续对组中过滤出 second 值。我的想法是在他们自己的列表中隔离第二个值并使用它来过滤整个数据集以获得我需要的值,但我正在努力寻找一种方法来做到这一点。

【问题讨论】:

标签: r


【解决方案1】:

如果要保留顺序记录,请尝试

library(dplyr)
zero_sum_ab %>% filter((ab_id - lag(ab_id)) == 1)

如果要丢弃顺序记录,请尝试

library(dplyr)
zero_sum_ab %>% filter(!(ab_id - lag(ab_id)) == 1)

【讨论】:

  • 感谢您的帮助...我现在可以看到我的措辞有点混乱。
  • profittt,您在这里的评论表明 CPak(和我)误解了您的问题并弄错了。您能否更新您的问题以解释此解决方案如何不适合您?没有这些,您似乎不太可能得到更合适的答案。如果这些答案确实有效,请accept one;这样做不仅为回答者提供了一些积分,而且还为有类似问题的读者提供了一些关闭。尽管您只能接受其中一项,但您可以选择对您认为有帮助的人进行投票。
  • @r2evans 我认为 OP 正在传达 OP 现在明白 filter out the second value 是模棱两可的。这可能意味着保留或丢弃第二个值,具体取决于您如何阅读它。很可能 OP 只是不了解复选标记接受答案系统,而不是征求更多答案。
  • 好点,我没这么看。谢谢。
【解决方案2】:

另一个选项,类似于 CPak 的:

dat <- data.frame(ab_id = c(2015000099, 2015000103, 2015000106, 2015000110, 2015000111, 2015000112, 2015000116, 2015000119))
dat
#        ab_id
# 1 2015000099
# 2 2015000103
# 3 2015000106
# 4 2015000110
# 5 2015000111
# 6 2015000112
# 7 2015000116
# 8 2015000119

dat[ c(TRUE, diff(dat$ab_id) != 1L),, drop = FALSE]
#        ab_id
# 1 2015000099
# 2 2015000103
# 3 2015000106
# 4 2015000110
# 7 2015000116
# 8 2015000119

同样,dplyr:

library(dplyr)
dat %>%
  filter(c(TRUE, diff(ab_id) != 1L))
#        ab_id
# 1 2015000099
# 2 2015000103
# 3 2015000106
# 4 2015000110
# 5 2015000116
# 6 2015000119

diff 只是 val - dplyr::lag(val) 的 base-R 简化)

【讨论】:

  • 我认为diff() 也更干净
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多