2011-08-25 114 views
5

我有一個有11列和100000行(例如)的大型數據集,其中值1,2,3,4。其中4是缺失值。一些行完全缺失。即全部11列中有4個。例如如何刪除R中只包含缺失值的行?

"4" "4" "4" "4" "4" "4" "4" "4" "4" "4" "4" 

現在我需要的是隻刪除那些完全缺失的行。簡單地說,我想保留缺少值小於11的行。我已經使用過na.omit,但它在我的情況下不起作用。

在此先感謝。

+0

一個這怎麼可能取決於你沒有提供的信息。這是數據框還是矩陣?值是以整數還是字符存儲的?試着用運行'str(head(foo))'的輸出來編輯你的問題,其中foo是你的數據。 – joran

回答

2

真正快捷的方法是使用一點數學。假設你的數據框被稱爲DATF

rsum <- rowSums(datf) 
datf <- datf[rowSums != 44,] #11 * 4 

(適用於矩陣太)

+2

我不會給你一個減1,但這種方法是非常危險的。它適用於這種特定情況,但如果添加/刪除列會發生什麼情況?始終以可靠的方式嘗試解決問題。 – Andrie

+1

這將不起作用,因爲如果所有元素均爲4(例如'c(4,4,4,4,4,4,4,4,4,3,5)'),則一行可以等於44。 –

+0

注意問題...值只能在此數據集中爲1,2,3或4。 – John

1

像這樣的東西應該做的伎倆(應爲兩個矩陣和data.frames工作):

ac<-matrix(c("4","4","4","4","4","4","4","3","3","4","4", rep("4", 11)), nrow=2, ncol=11, byrow=TRUE) 

rowsToRemove<-which(apply(ac, 1, function(currow){ 
    all(currow=="4") 
})) 

現在,你可以簡單地做

newac<-ac[-rowsToRemove,] 
11

也許你最好的選擇是利用R的成語與失蹤,或NA值。一旦編碼了NA值,您就可以使用complete.cases輕鬆實現您的目標。

創建遺漏值的一些樣本數據(即值4):

set.seed(123) 
m <- matrix(sample(1:4, 30, prob=c(0.3, 0.3, 0.3, 0.1), replace=TRUE), ncol=6) 
m[4, ] <- rep(4, 6) 

NA替換等於所有值設置爲4:

m[m==4] <- NA 
m 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 1 NA 2 2 2 
[2,] 2 3 3 1 2 3 
[3,] 3 2 2 1 2 3 
[4,] NA NA NA NA NA NA 
[5,] NA 3 1 NA 2 1 

現在你可以使用各種函數處理NA值。例如,complete.cases只會返回,你猜對了,完成情況:

m[complete.cases(m), ] 

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

欲瞭解更多信息,請參閱?complete.cases?na.failstats包。

+0

這不是問什麼。 OP只想刪除完全缺失的行。 – Kenji

2

這是我能想到的最快的解決方案。我將使用類似於@Andrie的示例數據。

set.seed(21) 
m <- matrix(sample(1:6, 110, replace=TRUE), ncol=11) 
missVal <- 4 
m[4, ] <- rep(missVal, 11) 
m <- m[ rowSums((m==missVal)) != NCOL(m), ] 

最後一行有效,因爲m==missVal返回邏輯(TRUE/FALSE)值的矩陣。 rowSums轉換TRUE 1和FALSE爲0,所以在這種情況下,我們知道所有的列是4每當rowSums收益11

2

我在其他地方發現了這個解決方案,我在這裏使用Andrie的代碼來生成初始數據集粘貼。

首先生成數據集:

set.seed(123) 
m <- matrix(sample(1:4, 30, prob=c(0.3, 0.3, 0.3, 0.1), replace=TRUE), ncol=6) 
m[4, ] <- rep(4, 6) 
m[m==4] <- NA 
m 

這裏是INTIAL數據集:

1 1 NA 2 2 2 
2 3 3 1 2 3 
3 2 2 1 2 3 
NA NA NA NA NA NA 
NA 3 1 NA 2 1 

現在刪除僅包含缺失觀察行:

m[rowSums(is.na(m))<ncol(m),] 

這裏是結果:

1 1 NA 2 2 2 
2 3 3 1 2 3 
3 2 2 1 2 3 
NA 3 1 NA 2 1 
2

使用data.table來提高內存效率。創建is.na(x)的解決方案正在創建與原始數據集一樣大的數據集,因此效率低下。

library(data.table) 
DT <- as.data.table(m) 
missing_value <- 4 
missing <- as.data.table(setNames(as.list(rep(4, length(DT)), names(DT)) 
setkeyv(DT, names(DT)) 
setkey(missing, names(DT)) 

DT[-DT[(missing),which=T]] 

既此又@ JoshuaUlrich的解決方案是快速大數據

set.seed(21) 
m <- matrix(sample(1:6, 1100000, replace=TRUE), ncol=11) 
missVal <- 4 
missing_rows <- sample(100000, 53) 
m[missing_rows, ] <- rep(missVal, 11) 

DT <- as.data.table(m) 
setkeyv(DT, names(DT)) 
missing <- setNames(as.list(rep(missVal, 11)), names(DT)) 

system.time({DT1 <- DT[-DT[missing,which=T]]}) 
## user system elapsed 
## 0.02 0.00 0.01 
system.time({m1 <- m[ rowSums((m==missVal)) != NCOL(m), ]}) 
## user system elapsed 
## 0.02 0.02 0.03 
+1

使用'T' /'F'而不是'TRUE' /'FALSE'時要小心,因爲'T'和'F'可以重新定義。 –