【问题标题】:Filter duplicates based on one row and exclude them based on value in other row根据一行过滤重复项并根据另一行中的值排除它们
【发布时间】:2021-08-10 12:37:27
【问题描述】:

我有一个带有纵向数据的 df。每个 id 都有几个秒测量值,但其中一些是重复的。我想删除秒列中每个 id 的重复项,但我想删除测量列中具有 NA 的重复项,因为在测量值中具有值的行包含我需要保留的其他信息。所以基本上我需要识别重复项,然后在另一列中删除带有 NA 的那些。 编辑: 但问题是,也有重复的测量行不是 NA 而是例如1 和 2。然后我需要删除 2,因为测量 1 包含相关的其他信息。有时也有重复的测量值都为 NA。

我的 df 看起来有点像这样:

id measurement seconds other relevant information
A 1 5000 blue
A NA 5000 NA
A 2 4000 NA
B 1 3400 red
B 2 5000 NA
B NA 5000 NA
C NA 3000 NA
C 1 3000 blue
D 1 2000 green
D 2 2000 NA
D 3 1000 NA
D NA 4000 NA
D NA 4000 NA

之后我需要它是这样的:

id measurement seconds ...
A 1 5000 blue
A 2 4000 NA
B 1 3400 red
B 2 5000 NA
C 1 3000 blue
D 1 2000 green
D 3 1000 NA
D NA 4000 NA

我知道可能有一个非常直接的 dplyr 解决方案,到目前为止我已经尝试过:

df <- df %>% group_by(id, seconds) %>% filter(n() > 1)

还有这个:

df <- df %>%
   group_by(id) %>%
   filter(measurement==NA & duplicates(seconds)

所以基本上我需要的 if else 命令是:

if "seconds" = duplicate & one measurement row == na -> delete the  na row
if "seconds" = duplicate & measurement == not na -> keep seconds = 1 row
if "seconds" = duplicate & both measurement == na -> delete randomly one

【问题讨论】:

  • 当您在measurement 中有NA 并且它不是重复项时会发生什么?你能在例子中包含这样的条件吗?
  • 非常感谢您的帮助!我只是意识到这对我不起作用,因为一些重复项在行中,测量值为 1 或 2 而不是 NA,我仍然需要删除它们。
  • 是的,这是问题之一,然后它排除了该行。我将更新上面的示例以显示这一点

标签: r filter dplyr duplicates


【解决方案1】:

measurement==NA 总是返回 NA。请改用is.na(measurement)。另外,您正在寻找命令duplicated

所以:

df <- df %>%
   group_by(id) %>%
   filter(is.na(measurement) & duplicated(seconds)

df <- df %>%
   group_by(id) %>%
   filter(is.na(measurement), duplicated(seconds)

【讨论】:

    【解决方案2】:

    我想我明白了:

    df <- df %>%
      arrange(measurement) %>%
       group_by(id) %>%
       filter(!duplicated(seconds))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多