当有NA值时,如何解决根据条件删除行的问题

How to solve this problem of removing rows based on a condition when there are NA values

我有这个数据

     col1   col2
#1   2012   a
#2   1995   b
#3   1998   a
#4   2001   d
#5   2021   c
#6   2021   a
#7   NA     b
#8   NA     d

我想删除带有 2021 的行。

首先是这个:

df <- subset(df, col1 != 2021)

问题:同时删除#7 和#8

然后是这个:

df <- filter(df, col1 != 2021)

问题:给出错误:初始化错误(...):尝试使用零长度变量名

然后是这个:

df <- df[df$col1 != 2021, ] 

问题:产生这个结果:

     col1   col2
#1   2012   a
#2   1995   b
#3   1998   a
#4   2001   d
#NA  NA     NA
#NA  NA     NA
#NA  NA     NA
#NA  NA     NA

我的目标是得到这个:

     col1   col2
#1   2012   a
#2   1995   b
#3   1998   a
#4   2001   d
#5   NA     b
#6   NA     d 

尝试

df = data.frame(col1 = c(2010:2022,NA, NA), col2 = c(NA, NA, rnorm(13)))

   col1       col2
1  2010         NA
2  2011         NA
3  2012  0.4247744
4  2013 -1.6378778
5  2014 -0.9633402
6  2015  1.0030133
7  2016  0.1063912
8  2017  2.2983095
9  2018 -1.0941622
10 2019  0.3604223
11 2020  0.9171499
12 2021  1.3803499
13 2022 -0.5693971
14   NA  1.1911385
15   NA  0.4741301

编辑


# Proposed fix: 
df[-which(df$col1 == 2021),]

   col1       col2
1  2010         NA
2  2011         NA
3  2012  0.4247744
4  2013 -1.6378778
5  2014 -0.9633402
6  2015  1.0030133
7  2016  0.1063912
8  2017  2.2983095
9  2018 -1.0941622
10 2019  0.3604223
11 2020  0.9171499
13 2022 -0.5693971
14   NA  1.1911385
15   NA  0.4741301

仅删除 col1 中的 2021 obs,保留所有 cols 中的 NA。

您似乎在尝试过滤掉某个年份,但又想保留缺少年份的行。试试这个。

df[is.na(df$col1) | df$col1 != 2021, ] 

dplyr 方法

df <- df %>% filter((col1 != 2021) %>% replace_na(TRUE))

输出

> df
  num col1 col2
1  #1 2012    a
2  #2 1995    b
3  #3 1998    a
4  #4 2001    d
5  #7   NA    b
6  #8   NA    d