我正在制作一个包含大量NA的表格,并通过编号进行回答 它看起来像这个
structure(list(ID = c(101, 102, 103, 104, 105, 106, 107, 108, 109, 110), a = c(NA, 9, NA, NA, NA, NA, NA, NA, NA, NA), b = c(NA, 10, 9, 9, NA, NA, 2, NA, NA,NA), c = c(NA, NA, NA, 9, 1, NA, NA, 4, 11, 9), d = c(NA, NA, NA, NA, 8, NA, NA, 7, 9, 9), e = c(NA, NA, NA, NA, 9, NA, NA, 8, NA, 9), f = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), g = c(NA, NA, NA, NA, NA, NA, NA, 9, NA, NA)), .Names = c("ID", "a", "b", "c", "d", "e", "f", "g"), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"))
我想要做的是删除仅包含数字9的行。 在这种情况下,ID 103,104,110就是这种情况。我希望删除这3行。
我尝试了以下代码
df1[rowSums(df1[-1]==9)==0,]
但是,由于表中有NA,它只会再现NA表。 请帮忙:(!
答案 0 :(得分:1)
您可以使用apply
检查整行:
df1[apply(df1[,-1], 1, function(x) !all(na.omit(x) == 9) | all(is.na(x))), ]
# ID a b c d e f g
# 1 101 NA NA NA NA NA NA NA
# 2 102 9 10 NA NA NA NA NA
# 5 105 NA NA 1 8 9 NA NA
# 6 106 NA NA NA NA NA NA NA
# 7 107 NA 2 NA NA NA NA NA
# 8 108 NA NA 4 7 8 NA 9
# 9 109 NA NA 11 9 NA NA NA
我使用na.omit
删除每行中的NA
- 值,然后检查所有剩余值是否等于9.
答案 1 :(得分:0)
您可以使用na.rm
参数忽略NAs:
df1[rowSums(df1[-1]==9, na.rm = TRUE) == 0, ]
但请注意,此代码只会保留没有任何 9的行,这不是您在问题中所要求的。
评论后编辑:
在这种情况下只需翻转:
df1[rowSums(df1[-1]!=9, na.rm = TRUE) > 0, ]
答案 2 :(得分:0)
这可能是一种更有效的方式,但我相信以下工作:
df1[!(apply(df1[-1] == 9, 1, prod, na.rm = TRUE) * !apply(is.na(df1[-1]), 1, prod)), ]