假设我的data.frame
在某些列中有NA
个值。我只想选择那些特定列不是NA
但在其所有列上都有NA
的行。
所以从这些数据中选择:
dat <- data.frame(x = c(1, 2, 4, NA, NA),
y = c(2, NA, 3, 5, 4),
z = c(NA, NA, NA, 4, 4),
p = c(NA, 4, NA, 3, 4))
x y z p
1 1 2 NA NA
2 2 NA NA 4
3 4 3 NA NA
4 NA 5 4 3
5 NA 4 4 4
这些行:
x y z p
1 1 2 NA NA
2 4 3 NA NA
答案 0 :(得分:4)
为您的数据
dat <- data.frame(x = c(1, 2, 4, NA, NA),
y = c(2, NA, 3, 5, 4),
z = c(NA, NA, NA, 4, 4),
p = c(NA, 4, NA, 3, 4))
您可以选择第一列不是NA而第二列不是NA的行:
> dat[!is.na(dat[,'x']) & !is.na(dat[,'y']),]
x y z p
1 1 2 NA NA
3 4 3 NA NA
答案 1 :(得分:2)
mycols = c("x", "y")
dat[Reduce("&", data.frame(!is.na(dat[names(dat) %in% mycols]))) &
Reduce("&", data.frame(is.na(dat[!names(dat) %in% mycols]))),]
# x y z p
#1 1 2 NA NA
#3 4 3 NA NA
答案 2 :(得分:2)
只需使用complete.cases
和
dat[complete.cases(dat[, c(1, 2)]) &
rowSums(is.na(dat[, -c(1, 2)])) == ncol(dat[, -c(1, 2)]), ]
答案 3 :(得分:0)
使用filter_at
中的dplyr
函数的解决方案。我们可以将列名放在vars
中,将选择条件放在all_vars
中,这意味着所有变量都需要满足条件。之后,我们可以选择除x
和y
之外的其他列,使其全部为NA
。
library(dplyr)
dat2 <- dat %>%
filter_at(vars(x, y), all_vars(!is.na(.))) %>%
filter_at(vars(-x, -y), all_vars(is.na(.)))
dat2
# x y z p
# 1 1 2 NA NA
# 2 4 3 NA NA
答案 4 :(得分:0)
以下是dplyr
使用filter
的另一种解决方案:
dat %>%
filter(!is.na(x) & !is.na(y))
<强>结果:强>
x y z p
1 1 2 NA NA
2 4 3 NA NA
答案 5 :(得分:0)
解释您不要求第3列和第4列必须具有NA,但这是允许的,这是另一个带有lapply
和Reduce
的基本R解决方案:
dat[!Reduce("|", lapply(dat[1:2], is.na)),]
x y z p
1 1 2 NA NA
3 4 3 NA NA
如果期望的结果另外要求第3列和第4列必须只包含NA(这是一个非常奇怪的请求),那么您可以添加类似的语句来获得此结果。
dat[!Reduce("|", lapply(dat[1:2], is.na)) & Reduce("&", lapply(dat[3:4], is.na)),]