我的数据帧有类似的列和行
Id Date Col1 Col2 Col3 X1
1 1/1/22 NA 1 0
1 1/1/22 0 0 1 6
2 5/7/21 0 1 0
2 5/7/21 0 2 0
我喜欢删除重复行(相同Id,相同日期(中X1列的值缺失或为空的行。如果这两行都缺少该ID和日期的X1,则不要删除。只有当其中一行缺失而另一行未缺失时,才删除缺失的行。
预期输出
Id Date Col1 Col2 Col3 X1
1 1/1/22 0 0 1 6
2 5/7/21 0 1 0
2 5/7/21 0 2 0
我试过这个
library(tidyr)
df %>%
group_by(Id, Date) %>%
drop_na(X1)
这会删除所有带有NA或缺失的行,而我只剩下一行,这不是我想要的。任何建议都是事先准备好的。谢谢
如果'X1'中只有缺失的值,或者只删除缺失的行,我们可以在filter
中创建一个条件来返回all
行
library(dplyr)
df %>%
group_by(Id, Date) %>%
filter(if(all(is.na(X1))) TRUE else complete.cases(X1)) %>%
ungroup
-输出
# A tibble: 3 × 6
Id Date Col1 Col2 Col3 X1
<int> <chr> <int> <int> <int> <int>
1 1 1/1/22 0 0 1 6
2 2 5/7/21 0 1 0 NA
3 2 5/7/21 0 2 0 NA
或者在没有if/else
的情况下,使用|
和&
条件
df %>%
group_by(Id, Date) %>%
filter(any(complete.cases(X1)) & complete.cases(X1) |
all(is.na(X1))) %>%
ungroup
数据
df <- structure(list(Id = c(1L, 1L, 2L, 2L), Date = c("1/1/22", "1/1/22",
"5/7/21", "5/7/21"), Col1 = c(NA, 0L, 0L, 0L), Col2 = c(1L, 0L,
1L, 2L), Col3 = c(0L, 1L, 0L, 0L), X1 = c(NA, 6L, NA, NA)),
class = "data.frame", row.names = c(NA,
-4L))