À l'aide de ifelse-après s'appliquent
Je suis en train de faire une nouvelle colonne dans mon dataset donner une sortie unique pour chaque ligne, selon les données de pré-colonnes existantes.
Dans la colonne de sortie, je désir "NA" si tout de l'entrée des vallées dans une ligne donnée sont "0". Sinon (si aucune des entrées sont à 0), je veux que la sortie de la ligne à être le nombre de valeurs uniques des entrées.
J'ai pensé que la solution serait d'utiliser un ifelse fonction imbriquée à l'intérieur d'un appliquer fonction, mais j'obtiens une erreur que je ne comprends pas.
data$output <- apply(data, 1, function(x) {ifelse(x == 0, NA, length(unique(x)))})
Erreur dans
$<-.data.frame
(*tmp*
, "sortie", valeur = c(3 L, 3 L, 3 L, 3L, :
remplacement de 3 lignes, des données a 4
Je ne sais pas pourquoi le remplacement a 3 lignes, j'ai pensé à s'appliquer avec la même fonction pour chacun de mes 4 lignes.
OriginalL'auteur Jordan Garner | 2015-06-10
Vous devez vous connecter pour publier un commentaire.
Vous voulez vérifier si l'une des variables dans une rangée sont 0, de sorte que vous devez utiliser
any(x==0)
au lieu dex == 0
dans leifelse
déclaration:Fondamentalement
ifelse
renvoie un vecteur de longueur n et si son premier argument est de longueur n. Vous souhaitez une valeur par ligne, mais ne sont que de passage plus d'un avecx==0
(le nombre de valeurs que vous êtes en passant est égal au nombre de colonnes dans votre bloc de données).De données:
OriginalL'auteur josliber
Laisser
n = length(x)
.ifelse
sera de retourrep(NA, n)
siTRUE
sinonrep(length(unique(x)), n)
. Doncapply
va générer une matrice.data$output <- apply(...
essaie d'attribuer une matrice (le résultat) dans une colonne dans votredata.frame
,data$output
. C'est la cause de votre erreur.Votre code sera exécuté si vous venez de vous attribuer votre sortie à une variable au lieu
out <- apply(data, 1, function(x) {ifelse(x == 0, NA, length(unique(x)))})
Si vous ne les attendez pas un
class(matrix)
que votre sortie, mais plutôt un vecteur, alors il ya quelque chose de mal avec la logique de votre fonction.OriginalL'auteur Vlo