8
votes

oleux ifelse () est le pire; Quel est le meilleur?


4 commentaires

Pour cette application particulière, la recherche de la première valeur non manquante, le nom de la commande SQL est coalesce , et il y a une très belle réponse de Mise en œuvre de la coopération de SQL dans R .


Veuillez utiliser set.sed


GREGOR, c'est exactement ça: je ne rencontrerais jamais réduire avant.


Je pense que j'ai un plus rapide pour ce cas particulier: RowMeans (cbind (y_1, y_2, y_3, y_4, y_5), na.rm = true) et rowsums Ahve a également travaillé si on peut être assuré qu'il y a un montant maximum de 1 article par "rangée".


3 Réponses :


5
votes

J'aime utiliser un coalesce () fonction pour ce xxx

alors vous pouvez faire xxx

Bien sûr, cela est très spécifique pour obtenir la première valeur non NA.


3 commentaires

Merci M. Flick - Avez-vous une préférence pour cette mise en œuvre sur ceux de Stackoverflow.com/Questtions/19253820/... ?


Non, vous devez tester pour voir ce qui est préférable dans votre application particulière.


Cette mise en œuvre est agréable car elle a une conversion de facteur et une manipulation des erreurs - les autres sont encore plus nues.



2
votes

Je pense que dans ce cas, vous pouvez utiliser la fonction de fusion pour convertir les données en format long, puis supprimer les valeurs manquantes:

library(reshape2)

set.seed(10)
N <- 1000
group <- sample(1:5, N, replace=TRUE)
Y_1 <- ifelse(group==1, rbinom(sum(group==1), 1, .5), NA)
Y_2 <- ifelse(group==2, rbinom(sum(group==2), 1, .5), NA)
Y_3 <- ifelse(group==3, rbinom(sum(group==3), 1, .5), NA)
Y_4 <- ifelse(group==4, rbinom(sum(group==4), 1, .5), NA)
Y_5 <- ifelse(group==5, rbinom(sum(group==5), 1, .5), NA)

Y_all = data.frame(group, Y_1, Y_2,Y_3,Y_4,Y_5)

Y_all.m = melt(Y_all, id.var="group")
Y_all.m = Y_all.m[!is.na(Y_all.m$value),]


4 commentaires

Si identique (y_all, y_.all.m $ valeur) être vrai? Il semble que les résultats ont été résolus de manière à ce que ce ne soit pas le cas. Hm, idito pour identique (y_all, y_all.m $ valeur [commande (rownames (y_all.m))])


Y_All.M est une longue version de Y_ALL, afin qu'ils ne soient pas identiques. Mais vous pouvez confirmer qu'ils ont les mêmes valeurs comme celle-ci: labraque (y_all [ - 1], table, exclure = null); TAPPLY (Y_ALL.M $ VALEUR, Y_ALL.M $ Variable, table, exclure = null) .


Je viens de me faire valoir que vous pouvez également faire: identique (un nom irréaliste (y_all [ - 1])), y_all.m $ valeur) (qui donne vrai ) .


Désolé - je voulais dire le Y_All (pas le fichier data.frame que vous donnez le même nom ici), que j'ai pris pour être la sortie souhaitée. Je peux voir que les comptes ont raison dans votre résultat avec (y_all.m, table (valeur, variable)); table (Y_ALL, groupe) , mais je ne vois pas quelque chose de correspondant à l'OP ' code> y_all ; c'est tout. Et je manque ce que le fondre fait pour vous.



1
votes

Stockez les vecteurs dans une matrice, puis sélectionnez:

Ymat    <- cbind(Y_1,Y_2,Y_3,Y_4,Y_5)
mycol   <- apply(!is.na(Ymat),1,which)

Y_all.f <- Ymat[cbind(1:nrow(Ymat),mycol)]

identical(Y_all,Y_all.f) # TRUE


0 commentaires