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
Il semble que le problème ait déjà été signalé dans les commentaires. Étant donné que certains vecteurs ne contiennent que NA
s, -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, NA
s ou ensembles vides sont souvent impliqués.
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