2017-01-26 38 views
1

我在我的數據集中有這樣的內容,我只想刪除一行,如果它只有NA,而不是它至少有一個值。只用NA刪除整行,在R

 [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 1 NA 4 
[3,] 4 6 7 
[4,] NA NA NA 
[5,] 4 8 NA 

在這種example他們能夠刪除我想要的東西,但是當我嘗試在完全相同的方式做,這是行不通的。

我已經嘗試過他們的例子:

數據[rowSums(is.na(數據))= NcoI位(數據)!]

但我行的數量不像這樣改變。

 [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 1 NA 4 
[3,] 4 6 7 
[4,] 4 8 NA 

我NA的不characters.if我問他們的階級:

class(NA) 
[1] "logical" 

你知道另一種方式來問這些,好嗎?

______UPDATE_____

也許我說錯了。

我的問題,這就是爲什麼有代碼是不能工作

mymat[rowSums(is.na(mymat)) != ncol(mymat), ] 

,因爲我有3列的信息,但在那之後,就是一切NA,像這樣:

Date   Product Code protein fat 
2016-01-01  aaa  0001  NA  NA 
2016-01-01  bbb  0003  NA  NA 
2016-02-01  ccc  0032  NA  NA 

所以行(1:5)

謝謝你!

+1

你沒有行號出現。請檢查暱稱 – akrun

回答

0

您需要刪除as.integer

mymat <- matrix(c(1:3, NA, 4:6, NA, rep(NA, 4)), ncol = 3) 

它轉換爲

 [,1] [,2] [,3] 
[1,] 1 4 NA 
[2,] 2 5 NA 
[3,] 3 6 NA 
[4,] NA NA NA 


mymat[as.integer(rowSums(is.na(mymat)) != ncol(mymat)), ] 

給你

 [,1] [,2] [,3] 
[1,] 1 4 NA 
[2,] 1 4 NA 
[3,] 1 4 NA 

但是你要

mymat[rowSums(is.na(mymat)) != ncol(mymat), ] 

要獲得

 [,1] [,2] [,3] 
[1,] 1 4 NA 
[2,] 2 5 NA 
[3,] 3 6 NA 

乾杯, 馬克

+0

感謝您的幫助,但我認爲我沒有很好地解釋我..現在我更新了我的問題,你能幫助我嗎? –

+0

我是否正確地要刪除列而不是行? –

+0

我以其他方式做了,但無論如何謝謝你! :) –

0

檢查這是否會與更新的解釋工作。當檢查NA時,它將子集data.frame忽略信息列。我添加包含數字的混合和NA

df1 <- data.frame(Date=c("2016-01-01", "2016-01-01", "2016-02-01", "2016-03-01", "2016-03-01"), 
       Product=c("aaa", "bbb", "ccc", "ddd", "eee"), 
       Code=c("0001", "0003", "0032", "0005", "0007"), 
       protein=c(NA, NA, NA, 5, NA), 
       fat=c(NA, NA, NA, NA, 4)) 

# place any columns you do not want to check for NA in names.info 
names.info <- c("Date", "Product", "Code") 
names.check <- setdiff(names(df1), names.info) 

df1[rowSums(is.na(df1[, names.check])) != length(names.check), ] 

     Date Product Code protein fat 
4 2016-03-01  ddd 0005  5 NA 
5 2016-03-01  eee 0007  NA 4 
+0

謝謝你的幫助,但是我想我沒有很好地解釋我..現在我更新了我的問題,你能幫助我嗎? –

+0

@AnaRaquel查看更新的答案,因爲這會忽略信息列,並且不管使用的數據列的數量如何 – manotheshark

0

首先一些附加行,我會迫使矩陣到一個數據幀,因爲這是典型的(「整潔」)來存儲變量和觀測格式。然後,你可以使用來自sjmisc-packageremove_empty_rows()功能:

庫(sjmisc)

df <- data.frame(
    a = c(1, 1, 4, NA, 4), 
    b = c(2, NA, 6, NA, 8), 
    c = c(3, 4, 7, NA, NA) 
) 

# get row numbers of empty rows 
empty_rows(df) 

## [1] 4 

# remove empty rows 
remove_empty_rows(df) 

## A tibble: 4 × 3 
##  a  b  c 
## * <dbl> <dbl> <dbl> 
## 1  1  2  3 
## 2  1 NA  4 
## 3  4  6  7 
## 4  4  8 NA 

也有功能列:empty_cols()remove_empty_cols()

如果你只是想保持完整的情況下(行),使用complete.cases()

df[complete.cases(df), ] 

## a b c 
## 1 1 2 3 
## 3 4 6 7