2016-08-12 123 views
-2

我有一個很大的數據幀,有很多行和列,我想刪除至少有一列是NA/NaN。下面是我一起工作的數據幀的一個小例子:R - 檢查r數據幀行的任何列是否存在NA,然後如果是這樣刪除該行

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值的行的方法,但又想對數據框的行中至少有一列具有NA值的行執行類似操作。

謝謝!

+3

'na.omit'或'complete.cases' – alistaire

回答

8

嘗試使用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 
+0

'complete.cases'應該比其他的更快 – akrun

7

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::filtermagrittr::extract,或[

1

您可以使用它。

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數量。你只保留那些非NAs總和爲零的行。

相關問題