【问题标题】:Only rows where difference between them is less than 'n' in groups仅在组中它们之间的差异小于“n”的行
【发布时间】:2020-07-06 07:11:42
【问题描述】:

假设我们有以下数据集,其中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

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

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

你能指出我的错误吗?

【问题讨论】:

  • 为什么要保留第5行?
  • 第 5 行和第 6 行的差为 1

标签: r dataframe dplyr


【解决方案1】:

您需要从两边减去值。试试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

【讨论】:

  • 谢谢,这是一个很好的答案,但是在我的原始数据集中,我的条件是 &lt;50 而不是 &lt;= 1,所以当我使用 lead() 时,有时差异实际上小于 50,让我们说 -48 是正确的,但有时是 -148,它也很好,但对我来说不是,因为我正在寻找差异 0-50,所以 abs()lead() 部分成功了 :) 我希望你明白我是正确的。
  • 是的,我正在考虑使用abs,但我不确定你是否需要它。
【解决方案2】:

这是另一种想法,我们创建容差为 1 的组,并过滤​​掉那些只有一个观察值的组,即

df %>% 
 group_by(V1, grp = cumsum(c(TRUE, diff(V2) != 1))) %>% 
 filter(n() > 1) %>%  
 ungroup() %>% 
 select(-grp)

# A tibble: 11 x 2
#   V1       V2
#   <fct> <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

【讨论】:

    猜你喜欢
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    相关资源
    最近更新 更多