【发布时间】: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