2014-06-17 20 views
0

我想「截斷」位於分位數之上或之下的數據框中的值。分位數函數錯誤

類似的東西,以 「TRUNC」 是一個矩陣:

for (i in 1 : ncol (TRUNC)) { 
for (j in 1 : nrow (TRUNC)) { 
if ((TRUNC[i,j] > quantile(TRUNC,probs=0.995,na.rm=T)) || (TRUNC[i,j] < 
quantile(TRUNC,probs=0.005,na.rm=T))) { 
TRUNC[i,j] = NA } } } 

,但我得到的錯誤信息一樣,所有的時間:

Fehler in if (na.rm) x <- x[!is.na(x)] else if (any(is.na(x))) 
stop("missing values and NaN's not allowed if 'na.rm' is FALSE") : 
Argument kann nicht als logischer Wert interpretiert werden 
Zusätzlich: Warnmeldung: 
In if (na.rm) x <- x[!is.na(x)] else if (any(is.na(x))) 
stop("missing values and NaN's not allowed if 'na.rm' is FALSE") : 
Bedingung hat Länge > 1 und nur das erste Element wird benutzt 

所以,我想一個簡單的例子:

A=matrix(seq(1,8),nrow=4) 
A[2,2]=NA 
quantile(A,probs=0.5) 

這也給我同樣的錯誤。

即使我嘗試這樣:

B=as.vector(A) 
quantile(B,na.rm=T) 

它不會工作!

如果有人能解釋我的解決方案,我將非常感激!

我的代碼有什麼問題?是不是na.rm = T應該解決數據集中的NAs問題?

+0

我真的不知道爲什麼,但在這種情況下,R不會承認na.rm = T!我剛剛發現它適用於na.rm = TRUE !!! T和TRUE有區別嗎?直到現在我總是使用「T」。 – path

+1

您在這些步驟之上的腳本中的任何位置定義了變量「T」嗎?你可以用'na.rm = TRUE'而不是'na.rm = T'來試試你的設置。 – asb

+0

嘗試運行'rm(T)'並再次執行它 –

回答

1

嗯......在您致電quantile時使用na.rm=TRUE。問題可能是您的變量T被定義爲其他值爲FALSE的值。這適用於我在這裏:

A=matrix(seq(1,8),nrow=4) 
A[2,2]=NA 
quantile(A,probs=0.5, na.rm=TRUE) 
+0

謝謝,asb! 1秒前,我自己發現了! (見上面的評論),但我真的不知道爲什麼... – path

+0

不知道,爲什麼downvote。如果將'na.rm = T'改爲'na.rm = TRUE',這是一個有效的答案。 – asb

+0

...你剛剛編輯你的答案。在它沒有解決實際問題之前。 –