2011-05-27 80 views
1

我有一個腳本,有一堆質量控制校驗和,它捕捉到一個數據集,因爲質量控制,不需要刪除任何樣本(行)。然而,這個腳本給了我一個零行數據框的意外結果。帶有示例數據,爲什麼這項工作:從數據幀中刪除零線產生零線的數據幀

data(iris) 
##get rid of those pesky factors 
iris$Species <- NULL 
med <- which(iris[, 1] < 4.9) 
medtemp <- iris[-med, ] 
dim(medtemp) 
[1] 134 4 

但這返回零行的數據幀:

small <- which(iris[, 1] < 4.0) 
smalltemp <- iris[-small, ] 
dim(smalltemp) 
[1] 0 4 

至於做這個的:

x <- 0 
zerotemp <- iris[-x, ] 
dim(zerotemp) 
[1] 0 4 

看來,smalltemp數據幀應與iris的尺寸相同,因爲根本沒有要移除的行。爲什麼是這樣?

回答

3

從Patrick Burns的p逐字複印。 41(我希望這構成了「合理使用」 - 如果有人反對,我會刪除它)

負什麼東西

> x2 <- 1:4 
> x2[-which(x2 == 3)] 
[1] 1 2 4 

以上返回命令的所有值的x2不等於至3

> x2[-which(x2 == 5)] 
numeric(0) 

希望是,上述命令將返回所有的x2因爲沒有元件 等於5現實將衝這種希望。相反,它返回一個長度爲 零的向量。 有以下兩個語句之間的細微差別:在輸入

x[] 
x[numeric(0)] 

微妙的差異,但在輸出端上的差沒有微妙。 原始問題至少有三種可能的解決方案。

out <- which(x2 == 5) 
if(length(out)) x2[-out] else x2 

另一種解決方案是使用邏輯標:

x2[!(x2 %in% 5)] 

或者你也可以,在一定意義上,向後工作:

x2[ setdiff(seq along(x2), which(x2 == 5)) ] 
+0

總是很好看將R地獄引用討論這個答案意味着它可能會再次進行審查的好時機。 – Stedy 2011-05-27 21:20:35

2

而不是使用which得到您的指數,我會使用一個布爾向量並否定它。這樣,你可以這樣做:

small <- iris[, 1] < 4.0 
smalltemp <- iris[!small, ] 
dim(smalltemp) 
[1] 150 4 

編輯:我不認爲0負指數(如你的情況)被允許,因爲沒有零指數,從而R可以不排除從指數您的選擇。負面索引可以解釋爲:「給我所有的行,除了那些具有這些索引的行」。

2

難道在你的第二個例子,small評估爲0?

以向量的零元素將始終返回空載體:

> foo <- 1:3 
> foo 
[1] 1 2 3 
> foo[0] 
integer(0) 
> 
2

這是因爲對如何處理是零索引做的規則。只允許嚴格正面或嚴格負面的指數。作爲[0]回報什麼,

R> -0 == 0 
[1] TRUE 

所以你什麼也得不到,你期望它下降什麼。

identical(0)問題被視爲由NULL建立索引,並將其記錄爲按索引編制0,因此具有相同的行爲。

這在R Language Definition manual