r仅在特定列中不缺失的情况下保留行

  • 本文关键字:情况下 保留 r dplyr tidyr
  • 更新时间 :
  • 英文 :


我的数据帧有类似的列和行

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))

相关内容

最新更新