如何在R中删除有条件的行

问题描述

我在尝试清理 R 中的数据框时遇到问题,并且在任何地方都找不到答案。

我有一个如下所示的数据框:

df <- data.frame(ID = c(1,1,2,3,3),A = c("yes","yes",NA,"no",NA),B = c("yes",time = c(0,1))
df
   ID    A    B time
1   1  yes  yes    0
2   1  yes   no    1
3   1 <NA> <NA>    0
4   1 <NA> <NA>    1
5   2  yes   no    0
6   2   no   no    1
7   2 <NA> <NA>    0
8   2 <NA> <NA>    1
9   3   no   no    0
10  3 <NA> <NA>    0
11  3 <NA> <NA>    1

我想要的是这个:

df
   ID    A    B time
1   1  yes  yes    0
2   1  yes   no    1
5   2  yes   no    0
6   2   no   no    1
9   3   no   no    0
11  3 <NA> <NA>    1

这样每个 ID 在时间 0 和 1 出现两次。我不能使用像 df[complete.cases(df[,2]),] 这样的东西,因为这会删除第 10 行,而 unique(df)duplicated() 只会使数据框基本保持不变。

有什么想法吗?

解决方法

我们可以使用 match :

library(dplyr)
df %>% group_by(ID) %>% slice(match(c(0,1),time))

#     ID A     B      time
#  <int> <chr> <chr> <int>
#1     1 yes   yes       0
#2     1 yes   no        1
#3     2 yes   no        0
#4     2 no    no        1
#5     3 no    no        0
#6     3 <NA>  <NA>      1

数据

df <- structure(list(ID = c(1L,1L,2L,3L,3L),A = c("yes","yes","<NA>","no","<NA>"),B = c("yes",time = c(0L,0L,1L)),class = "data.frame",row.names = c(NA,-11L))
,
df[!duplicated(paste(df$ID,df$time)),]

#    ID    A    B time
# 1   1  yes  yes    0
# 2   1  yes   no    1
# 5   2  yes   no    0
# 6   2   no   no    1
# 9   3   no   no    0
# 11  3 <NA> <NA>    1

可重现的数据

df <- data.frame(
  ID   = c(1,1,2,3,3),A    = c("yes",NA,NA),B    = c("yes",time = c(0,1)
)