我的数据框有两列,看起来像这样
1 NA
NA 2
2 5
3 NA
NA NA
如何返回两个值均小于3或都不为NA的行?输出如下:
1 NA
NA 2
NA NA
答案 0 :(得分:3)
一种选择是将replace
的值NA
设置为预期值,在逻辑矩阵上进行rowSums
并将其转换为用于子集行的逻辑向量 >
df1[rowSums(replace(df1, is.na(df1), 2) < 3) == 2,]
# v1 v2
#1 1 NA
#2 NA 2
#5 NA NA
df1 <- structure(list(v1 = c(1L, NA, 2L, 3L, NA), v2 = c(NA, 2L, 5L,
NA, NA)), class = "data.frame", row.names = c(NA, -5L))
答案 1 :(得分:2)
您可以使用apply
,然后测试全部是NA
还是全部是<3
。
x <- read.table(text="1 NA
NA 2
2 5
3 NA
NA NA")
x[apply(x, 1, function(y) {all(is.na(y)) || all(y[!is.na(y)]<3)}),]
# V1 V2
#1 1 NA
#2 NA 2
#5 NA NA
或者从@kath看到的评论更简单:
x[apply(x, 1, function(y) {all(y < 3, na.rm = TRUE)}),]
或变体形式:
x[apply(x, 1, function(y) {all(y[!is.na(y)] < 3)}),]
答案 2 :(得分:1)
可能比它应该的要复杂,但是可行:
a = c(1, NA, 2, 3, NA)
b = c(NA, 2, 5, NA, NA)
list.ab = as.data.frame(list(a = a, b = b))
list.rows = c()
for (x in 1:nrow(list.ab)) {
row = list.ab[x, ]
nas = sum(is.na(row))
lowerthan3 = sum(row < 3, na.rm = T)
total.conds = nas + lowerthan3
if (total.conds == 2) {
list.rows = c(list.rows, x)
}
}
print(list.ab[list.rows, ])
a b
1 1 NA
2 NA 2
5 NA NA