2014-07-01 202 views
4

我有以下工作代碼。當我在不同的數據集重複同樣的事情,我得到的錯誤:(R max功能忽略NA

#max by values 
df <- data.frame(age=c(5,NA,9), marks=c(1,2,7), story=c(2,9,NA)) 
df 

df$colMax <- apply(df[,1:3], 1, function(x) max(x[x != 9],na.rm=TRUE)) 
df 

我試圖做同樣的一個更大的數據,我得到警告,爲什麼?

maindata$max_pc_age <- apply(maindata[,c(paste("Q2",1:18,sep="_"))], 1, function(x) max(x[x != 9],na.rm=TRUE)) 


50: In max(x[x != 9], na.rm = TRUE) : 
    no non-missing arguments to max; returning -Inf 

以理解這個問題更好的我做了如下的變化,但仍然得到警告

maindata$max_pc_age <- apply(maindata[,c(paste("Q2",1:18,sep="_"))], 1, function(x) max(x,na.rm=TRUE)) 
1: In max(x, na.rm = TRUE) : no non-missing arguments to max; returning -Inf 
+2

是否可以從最大的'結果找出問題(數字(0))',或者你需要更多解釋? – joran

+0

仍然需要幫助...我嘗試過類(數字(0)),它返回數字..什麼是最大功能的工作呢? – user2543622

+4

它_is_工作。如果矢量中沒有元素,那麼最大值是多少?你要求的最大值不是9,也不是NA_。顯然有時候沒有剩下任何東西。 – joran

回答

7

看來這個問題已經指出了意見了。由於一些載體僅包含NA s,-Inf已報告,我從您不喜歡的評論中獲得。在這個答案中,我想指出解決這個問題的一種可能的方法,即建立一個控制聲明(而不是在事實之後重寫-Inf,這同樣有效)。例如,

my.max <- function(x) ifelse(!all(is.na(x)), max(x, na.rm=T), NA) 

是否這樣做。如果x中的每個(all)元素是NA,則返回NA,否則返回max。如果您想要返回任何其他值,只需交換NA即可。你也可以很容易地將它建成你的apply-功能。例如。

maindata$max_pc_age <- apply(maindata[,c(paste("Q2",1:18,sep="_"))], 1, my.max) 

我仍然有時用R的NA和空集治療相混淆。像test <- NA; test==NA這樣的陳述將給出NA作爲結果(而不是TRUE,由is.na(test)返回),有時候這樣做是合理的,因爲缺少這個值以後,你怎麼能知道這兩個缺失值是相同的?然而,在這種情況下,max返回-Inf,因爲它給出了一個空集,我認爲這並不明顯。我的經驗是,如果出現奇怪和意想不到的結果,通常會涉及到NA或空集。

1

的情況下象下面這樣:

df[2,2] <- NA 
df[1,2] <- -5 

apply(df, 1, function(x) max(x[x != 9],na.rm=TRUE)) 
#[1] 5 -Inf 7 
#Warning message: 
#In max(x[x != 9], na.rm = TRUE) : 
# no non-missing arguments to max; returning -Inf 

你可以這樣做:

df1 <- df 
minVal <- min(df1[!is.na(df1)])-1 

df1[is.na(df1)|df1==9] <- minVal 
val <- do.call(`pmax`, df1) 
val[val==minVal] <- NA 
val 
#[1] 5 NA 7 
+1

+1對於pmax/pmin,雖然當只有一個未標記的參數被傳遞時,可以開發更好的方法,排除所有這些「do.call」業務。你可以重載它以使'na.rm = T'成爲默認值,或者你可以說'do.call(pmax,c(df1,list(na.rm = T))'。 – AdamO