R - 检查 r 数据框行的任何列中是不是存在 NA,如果存在,则删除该行 [重复]
Posted
技术标签:
【中文标题】R - 检查 r 数据框行的任何列中是不是存在 NA,如果存在,则删除该行 [重复]【英文标题】:R - check if NA exists in any column of r dataframe row, then if so remove that row [duplicate]R - 检查 r 数据框行的任何列中是否存在 NA,如果存在,则删除该行 [重复] 【发布时间】:2016-12-19 19:46:58 【问题描述】:我有一个包含许多行和列的大型数据框,我想删除至少 1 列为 NA / NaN 的行。下面是我正在使用的数据框的一个小示例:
team_id athlete_id GP tm_STL tm_TOV player_WS
1 13304 75047 1 2 8 NaN
2 13304 75048 1 2 8 0.28563827
3 13304 75049 1 2 8 NaN
4 13304 75050 1 2 8 NaN
5 13304 75053 1 2 8 0.03861989
6 13304 75060 1 2 8 -0.15530707
...尽管是一个不好的例子,因为在这种情况下,所有的 NaN 都显示在最后一列中。我熟悉which(is.na(df$column_name))
的方法,用于从单个列中获取具有 NA 值的行,但再次想要对数据帧的一行中至少有 1 列具有 NA 值的行执行类似的操作。
谢谢!
【问题讨论】:
na.omit
或 complete.cases
【参考方案1】:
尝试使用complete.cases
。
> df <- data.frame(col1 = c(1, 2, 3, NA, 5), col2 = c('A', 'B', NA, 'C', 'D'),
col3 = c(9, NaN, 8, 7, 6))
> df
col1 col2 col3
1 1 A 9
2 2 B NaN
3 3 <NA> 8
4 NA C 7
5 5 D 6
> df[complete.cases(df), ]
col1 col2 col3
1 1 A 9
5 5 D 6
【讨论】:
complete.cases
应该比其他的更快【参考方案2】:
na.omit
工作:
na.omit(df)
## team_id athlete_id GP tm_STL tm_TOV player_WS
## 2 13304 75048 1 2 8 0.28563827
## 5 13304 75053 1 2 8 0.03861989
## 6 13304 75060 1 2 8 -0.15530707
如果您使用管道,它比 complete.cases
更方便一点,因为它不需要像 dplyr::filter
、magrittr::extract
或 [
这样的子集函数。
【讨论】:
【参考方案3】:你可以使用它。
df[rowSums(is.na(df))==0,]
# team_id athlete_id GP tm_STL tm_TOV player_WS
#2 13304 75048 1 2 8 0.28563827
#5 13304 75053 1 2 8 0.03861989
#6 13304 75060 1 2 8 -0.15530707
这样可以计算每行的 NA 数量。您只保留非 NA 的总和为零的行。
【讨论】:
以上是关于R - 检查 r 数据框行的任何列中是不是存在 NA,如果存在,则删除该行 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何编写 R 脚本来检查直线;即,对于任何给定的行,一组列中的所有值是不是具有相同的值