如何删除包含特定数字的行

时间:2018-02-01 10:36:00

标签: r

我正在制作一个包含大量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表。 请帮忙:(!

3 个答案:

答案 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)), ]