首页 > 解决方案 > 仅在组中它们之间的差异小于“n”的行

问题描述

假设我们有以下数据集,其中的值V2按组升序排列V1

Input =("   V1  V2
1   A   3
2   A   4
3   A   5
4   A   6
5   A   12
6   A   13
7   B   4
8   B   5
9   B   6
10  B   12
11  C   13
12  C   14
13  C   18")

df = as.data.frame(read.table(textConnection(Input), header = T, row.names = 1))

现在我想保留连续行之间的差异为 的行<= 1,所以我想要的输出:

   V1 V2
1   A  3
2   A  4
3   A  5
4   A  6
5   A 12
6   A 13
7   B  4
8   B  5
9   B  6
11  C 13
12  C 14

但是,当我使用:

df %>%
  group_by(V1) %>%
  filter(c(0,diff(V2)) <= 1)

我有:

   V1       V2
 1 A         3
 2 A         4
 3 A         5
 4 A         6
 5 A        13
 6 B         4
 7 B         5
 8 B         6
 9 C        13
10 C        14

缺少值为 12的行,V2它应该在数据集中。我也试过,lag()但结果是一样的。

df %>%
  group_by(V1) %>%
  filter(V2 - lag(V2) <= 1 | is.na(V2 - lag(V2)))

你能指出我的错误吗?

标签: rdataframedplyr

解决方案


您需要从两侧减去值。尝试leadlag

library(dplyr)

df %>%
  group_by(V1) %>%
  filter(V2 - lag(V2) <= 1 | V2 - lead(V2) <= 1)

#   V1       V2
#   <chr> <int>
# 1 A         3
# 2 A         4
# 3 A         5
# 4 A         6
# 5 A        12
# 6 A        13
# 7 B         4
# 8 B         5
# 9 B         6
#10 C        13
#11 C        14

推荐阅读