【问题标题】:Remove entire Row if Column == NA in R [duplicate]如果R中的Column == NA,则删除整行[重复]
【发布时间】:2018-09-08 07:02:55
【问题描述】:

试图删除此行但无法获取。我已经尝试过关于 SO 的多个问答,但似乎没有任何效果。尝试按照某人的建议使用sjmisc 库,但它仍然存在。这是我在下面尝试过的以及df 的一个片段。

编辑:

下面是一个 DataFrame 来测试。删除了不正确且不正确的数据框的图片。

df<-data.frame(name=c('CAREY.PRICE',NA,'JOHN.SMITH'),GA=c(3,2,2),SV=c(2,2,NA),stringsAsFactors = FALSE)

哪个会返回:

name       |  GA  | SV
CAREY.PRICE|  3   | 2
NA         |  2   | 2
John.Smith |  2   | NA 

以下回复的问题:

df = df[complete.cases(df),]

它从技术上回答了上述问题,如果任何行中的列有 NA,则将其删除。我应该澄清一下,我希望它成为我选择的列,它本来是df$name 中的NA。

这将删除NA 和John.Smith。这导致我的脚本出现问题,并且我的 DF 中缺少 name(players)。

我的脚本中还有na.omit(),它也删除了NA 和John.Smith。 我的 DF 中有 40 个变量,写出每个可能的变量,其中可能有也可能没有 NA 会太多。我的临时解决方案是将所有 NA 更改为 0:

df[is.na(df)] <- 0

返回:

name       |  GA  | SV
CAREY.PRICE|  3   | 2
0          |  2   | 2
John.Smith |  2   | 0

然后删除任何为 0 的df$name:

df<-df[!(df$name==0),]

我在寻找什么:

name       |  GA  | SV
CAREY.PRICE|  3   | 2
John.Smith |  2   | 0

【问题讨论】:

  • 你试过na.omit()吗?
  • 是的,我试过了
  • 修复了@Tjebo 上面的问题。让我知道是否有更快的解决方案。谢谢
  • stackoverflow.com/questions/11254524/…。在这些情况下,我正在使用这个定制的函数complete_fun。我有它在我自己的个人实用程序包中。或者,正如对该问题的最受好评的答案所暗示的或根据我在下面的评论 - 使用df[!is.na(df$name),]
  • 我也会将此标记为重复 - 真的不想刻薄。这只会帮助将人们引导到已经有很好答案的另一个问题。

标签: r na


【解决方案1】:

complete. cases 查找没有任何 NA 的行。

因此,您的问题的答案是:

df = df[complete.cases(df),]

【讨论】:

  • 它将输出更改为 factor 而不是 dataframe
  • 就是这样!非常感谢你。已经为此苦苦挣扎了一段时间。
  • @MichaelTJohnson 是否可以接受 factor 输出?
  • 我认为 df[!is.na(df),] 可能会带来相同的结果 - OP 提供更好的样本数据会有所帮助。我不明白为什么na.omit 不会产生预期的效果。
  • @Salman,老实说,我不确定区别。我的脚本成功了。我得查一下它是什么。
【解决方案2】:

这是一种在 name 字段中使用 NA 过滤行的方法:

library(dplyr)
df %>% filter(!is.na(name))

#>          name GA SV
#> 1 CAREY.PRICE  3  2
#> 2  JOHN.SMITH  2 NA

【讨论】:

  • 很好,然后我会将 na 转换为 0 用于其他变量。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 2023-03-13
相关资源
最近更新 更多