我有一個有11列和100000行(例如)的大型數據集,其中值1,2,3,4。其中4是缺失值。一些行完全缺失。即全部11列中有4個。例如如何刪除R中只包含缺失值的行?
"4" "4" "4" "4" "4" "4" "4" "4" "4" "4" "4"
現在我需要的是隻刪除那些完全缺失的行。簡單地說,我想保留缺少值小於11的行。我已經使用過na.omit,但它在我的情況下不起作用。
在此先感謝。
我有一個有11列和100000行(例如)的大型數據集,其中值1,2,3,4。其中4是缺失值。一些行完全缺失。即全部11列中有4個。例如如何刪除R中只包含缺失值的行?
"4" "4" "4" "4" "4" "4" "4" "4" "4" "4" "4"
現在我需要的是隻刪除那些完全缺失的行。簡單地說,我想保留缺少值小於11的行。我已經使用過na.omit,但它在我的情況下不起作用。
在此先感謝。
像這樣的東西應該做的伎倆(應爲兩個矩陣和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,]
也許你最好的選擇是利用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.fail
在stats
包。
這不是問什麼。 OP只想刪除完全缺失的行。 – Kenji
這是我能想到的最快的解決方案。我將使用類似於@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
我在其他地方發現了這個解決方案,我在這裏使用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
使用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
使用'T' /'F'而不是'TRUE' /'FALSE'時要小心,因爲'T'和'F'可以重新定義。 –
一個這怎麼可能取決於你沒有提供的信息。這是數據框還是矩陣?值是以整數還是字符存儲的?試着用運行'str(head(foo))'的輸出來編輯你的問題,其中foo是你的數據。 – joran