当有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
我有这个数据
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