web-dev-qa-db-fra.com

Fonction R max ignorer NA

J'ai ci-dessous le code de travail. Lorsque je réplique les mêmes choses sur un autre ensemble de données, des erreurs se produisent :(

#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

J'ai essayé de faire la même chose sur une plus grande donnée et je reçois des avertissements, pourquoi?

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

afin de mieux comprendre le problème, j'ai apporté les modifications décrites ci-dessous, mais j'ai quand même eu des avertissements

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
6
user2543622

Il semble que le problème ait déjà été signalé dans les commentaires. Étant donné que certains vecteurs ne contiennent que NAs, -Inf est signalé, ce qui ressort des commentaires que vous n'aimez pas. Dans cette réponse, j'aimerais indiquer une solution possible au problème, à savoir intégrer une instruction de contrôle (au lieu de remplacer -Inf après le fait, ce qui est également valable). Par exemple,

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

fait ce tour. Si chaque élément (all) dans x est NA, alors NA est renvoyé, et max sinon. Si vous souhaitez qu'une autre valeur soit renvoyée, échangez simplement NA pour cette valeur. Vous pouvez également intégrer cela facilement à votre fonction apply-. Par exemple. 

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

Je suis encore parfois parfois dérouté par le traitement de NA et jeu vide de R. Des déclarations telles que test <- NA; test==NA donneront NA comme résultat (au lieu de TRUE, renvoyé par is.na(test)), ce qui est parfois rationalisé en disant que puisque la valeur est manquante, comment pouvez-vous savoir que ces deux valeurs manquantes sont identiques? Dans ce cas, cependant, max renvoie -Inf puisqu'il est donné un ensemble vide, ce qui, à mon avis, n’est pas du tout évident. Mon expérience est cependant que si des résultats étranges et inattendus apparaissent, NAs ou ensembles vides sont souvent impliqués. 

10
coffeinjunky

Dans les cas comme ci-dessous:

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

Vous pourriez faire:

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
akrun