我是一名使用R的研究生,并且一直在阅读有关从数据框中删除包含NA的行的其他Stack Overflow答案。我试过了na.omit和complete.cases。当使用它们时,它表明已经删除了具有NA的行,但是当我写出summary(data.frame)时,它仍然包含NA。实际上是删除了带NA的行还是我做错了?
na.omit(Perios)
summary(Perios)
Perios[complete.cases(Perios),]
summary(Perios)
答案 0 :(得分:1)
错误是您实际上没有分配na.omit
的输出!
Perios< - na.omit(Perios)
如果您知道NAs出现在哪一列,那么您可以执行
Perios [!is.na(Perios $骨膜炎)]
或更一般地说:
Perios[!is.na(Perios$colA) & !is.na(Perios$colD) & ... ,]
然后作为R的一般安全提示,抛出一个na.fail断言它有效:
na.fail(Perios) # trust, but verify! Die Paranoia ist gesund.
答案 1 :(得分:1)
is.na
不是正确的功能。您想要complete.cases
,并希望complete.cases
相当于function(x) apply(is.na(x), 1, all)
或na.omit
来过滤数据:
也就是说,您希望所有没有NA
值的行。
< x <- data.frame(a=c(1,2,NA), b=c(3,NA,NA))
> x
a b
1 1 3
2 2 NA
3 NA NA
> x[complete.cases(x),]
a b
1 1 3
> na.omit(x)
a b
1 1 3
然后将其分配回x
以保存数据。
complete.cases
返回一个向量,输入数据帧的每一行一个元素。另一方面,is.na
返回一个矩阵。这不适合返回完整的情况,但可以将所有非NA值作为向量返回:
> is.na(x)
a b
[1,] FALSE FALSE
[2,] FALSE TRUE
[3,] TRUE TRUE
> x[!is.na(x)]
[1] 1 2 3