J'ai une ligne de code suivante qui remplace une valeur dans une variable ( Cependant, je voudrais étendre cela et remplacer les variables (par exemple, J'ai essayé p> qui ne fonctionnerait pas correctement et je voudrais savoir pourquoi et comment modifier de manière optimale le code. p> p> var2 code>) en fonction d'une valeur dans une autre variable ( var1 code>) var5 code>) dans la trame de données en fonction des valeurs dans plusieurs autres variables ( var1 code>, var2 code>, var3 code>, var4 code>) qui sont codés dans des colonnes spécifiques 13:16. p>
4 Réponses :
Vous pouvez obtenir une meilleure compréhension en regardant des parties plus petites de votre code.
premier regard sur Alors que pouvez-vous faire? Vous pouvez utiliser Ceci entraînera un vecteur qui contient df [c (13:16)]> 0 code>: le résultat est une matrice avec Juste true code> et false code> dedans. En particulier, vous ne pouvez pas utiliser df $ var5 [df [c [c (13:16)]> 0] code> car l'objet interne est une matrice et que vous ne pouvez pas sous-ensemble vecteur avec matrice. P> appliquer code> pour transformer cette matrice en un vecteur: p> true code> Si tous les éléments d'une ligne sont true code> et false code> sinon.
Et enfin, vous pouvez utiliser df $ var5 [idx] <- na / code> p> p>
Tout d'abord quelques données puis pour une variable p> et pour plusieurs p>
RG255, merci pour votre réponse. dt1 [v1 <0 & v2 <0 & v3 <0, v5: = na] code> change V5 sur NA si toutes les variables sont <0, je devrais changer V5 sur NA si une variable V1 : v3 est <0.
DT1 [(V1 + V2 + V3) <0, V5: = NA] CODE> Résolu mon problème, mais cela ne fonctionne pas sur mon ensemble de données réel. J'ai beaucoup de valeurs NA dans toutes les variables et je me demande si cela pourrait être un problème et, dans l'affirmative, comment traiter de manière à ce que les valeurs NA soient traitées comme 0.
Substituez le & code> pour | code> (l'opérateur conditionnel "ou")
En outre, utilisez ! (Is.na (v1)) code> ... (ou sans la marque d'exclamation selon les besoins) pour faire face au NAS
Voici un Suivant, nous sommes conditionnellement créé sur 2020-01-22 par le RepreX Package (v0.3.0) sup> p> en fonction de votre commentaire ci-dessous, nous utilisons le et maintenant nous remplaçons créé sur 2020-01-22 par le package Reprex (v0.3.0) sup> p> p> Tidyverse code> réponse. Tout d'abord, nous créons un jeu de données factice. À des fins d'impression, j'ai uniquement créé une avec 10 variables, plutôt que le 16 que vous avez demandé: muté code> variable var5 code> var5 code > tel qu'il est égal à na code> uniquement si toutes les variables var6: var9 code> sont supérieures à 0 code>, et gardez sinon leurs valeurs d'origine: p> | < / code> opérateur à dire "ou" au lieu de & code> pour dire "et". Tout d'abord, nous créons un nouveau jeu de données factices avec beaucoup d'autres 0 code> S à des fins de démonstration: p> & code > avec | code>: p>
Merci pour votre réponse, mais mon objectif est de remplacer les valeurs de Var5 non seulement si toutes les variables de Var6: Var9 sont> 0, mais si l'une de ces variables est> 0. En d'autres termes, si Var6: Var9 sont tous 0, la valeur en Var5 reste la même, dès qu'il n'y a une valeur supérieure à 0 dans l'une quelconque des variables Var6: Var9, la valeur en VAR9 devrait devenir Na.
Ok je comprends - s'il vous plaît voir mon édition dans la réponse ci-dessus
Voici une solution de base r, une modification légèrement basée sur votre code Notez que donné alors p> df [c (13:16)]> 0 code> vous donne un matrice, mais vous n'avez besoin que d'un vecteur pour sous-ensemble df $ var5 code>, donc rowsums () code> peut vous aider à vérifier si toute la ligne est remplie de traductions. P> exemple strong> p> df code> comme p> > df
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 resp
1 0 0 1 2 0 2 3 1 1 NA 4 3 2 3 2 4 NA
2 3 0 3 2 4 1 3 2 2 NA 4 1 4 1 2 2 NA
3 0 NA 0 NA 4 1 0 3 2 3 0 4 0 1 1 2 NA
4 1 4 NA 3 NA 4 4 0 2 NA 4 4 0 1 0 0 NA
5 4 4 0 NA 0 1 4 2 NA 3 3 3 0 0 3 0 NA
6 2 1 3 2 0 4 NA 4 2 1 1 3 NA 0 1 1 NA
7 NA 1 0 0 2 3 0 2 4 0 NA 0 4 3 4 4 NA
8 1 NA NA 3 NA 4 2 3 2 2 1 1 3 3 4 0 NA
9 2 0 1 4 1 3 NA 1 0 0 0 3 3 4 2 2 NA
10 2 3 2 0 1 NA 2 0 1 NA 4 0 3 4 1 1 NA
11 0 0 1 0 2 0 NA 3 3 0 4 0 NA NA 3 3 NA
12 4 3 NA NA NA 2 2 0 1 3 NA 2 3 0 2 0 NA
13 4 2 NA 3 1 1 2 3 1 4 NA 0 4 4 2 2 NA
14 1 NA 1 4 3 2 3 1 3 0 1 0 1 3 NA 0 NA
15 NA 1 4 4 2 2 0 4 4 2 NA NA 3 NA NA NA NA
16 NA 1 1 3 4 0 0 1 0 3 NA NA 0 0 0 4 NA
17 1 NA NA NA 1 4 3 1 4 4 4 NA 3 1 3 3 NA
18 0 3 NA 4 1 NA 1 1 4 3 1 3 NA 0 4 1 NA
19 4 3 NA 3 0 NA NA 2 4 0 NA 2 3 4 3 4 NA
20 4 3 0 3 2 NA 0 0 3 0 NA 4 4 1 NA 4 NA
Merci pour votre réponse. Je ne comprends pas l'élément == 4. Pourriez-vous s'il vous plaît expliquer?
@Evabalgova Le nombre de colonnes de 13 à 16
@Thomaslscoding, cela ne fonctionne pas pour moi et je ne suis pas sûr de savoir pourquoi. Cela fonctionne bien avec une variable, mais pas lorsque je souhaite utiliser une gamme de variables. J'ai beaucoup de NA dans les données et essayé d'ajouter na.rm = true code> à la ligne de code mais ne change toujours pas VAR5 sur NA malgré des valeurs supérieures à 0 dans les autres variables.
@Evabalgova Vous avez fait de droite en ajoutant na.rm = t code> lorsque na code>. Cependant, je n'ai aucune idée de quelle est l'erreur sans voir vos vraies données
Il n'y a pas d'erreur, le code s'exécute bien, mais les valeurs de Var5 ne changent pas du tout et restent comme elles sont.
@Evabalgova Vous avez dit: «Cela fonctionne bien avec une variable, mais pas lorsque je souhaite utiliser une gamme de variables». Voulez-vous dire une variable pour une colonne?
L'exemple spécifique que j'utilise est: fer_tms_nopractice_recoded_replacéd $ SCRAM1.RESP [Rowsums (Fer_ TMS_NOPRACTICE_RECOD ED_REPLACÉD [C (12)]> 0, Na.rm = true) == 1] <- NA CODE> Cela fonctionne bien et change les valeurs dans Scram1.RESP pour ces lignes où visage.resp> 0, hovever pour Fer_tms_nopractice_recoded_replacéd $ SCRAM5.RESP [Rowsums (Fer_ TMS_NOPRACTICE_RECOD ED_RePLACÉD [C (12:16)]> 0, na.rm = true) == 5] <- NA CODE> Scram5.ReM reste telle qu'elle est malgré des valeurs supérieures à 0 en colonnes 12:16.
@Evabalgova Voir mes mises à jour avec un exemple avec des données factices, ça fonctionne bien
Merci @thomaslscoding, mais la règle que vous avez appliquée modifiée est modifiée respers sur NA si aucune des colonnes 12:16 était 0. J'ai besoin de changer respers sur NA s'il y a une valeur supérieure à 0 dans l'une des colonnes 12:16. Par exemple, la rangée 3 de REEE devrait également avoir également été modifiée en Na sous la forme X12, X14, X15 et X16. Fondamentalement, REEE devrait rester inchangée si x12: X16 sont toutes 0 ou NA ou une combinaison de 0 et Na. Toute autre valeur dans l'une des colonnes 12:16 devrait permettre de remplacer la valeur dans REEE vers NA. De nombreuses excuses de ne pas pouvoir être très claires.
@Évabalgova Je suppose que j'ai eu votre point maintenant ... vous avez ou code> sur les colonnes, plutôt que & code>, est-ce?
@Evabalgova Je suppose que ce dont vous avez besoin est df $ resp [Rowsums (df [12:16]> 0, na.rm = t)> 0] <- na / code>. Vous pouvez vérifier mes mises à jour
Je sais que des commentaires comme celui-ci ne sont pas les bienvenus ici, mais je ne peux pas m'en empêcher. @Thomaslscoding qui isbrilliant! Fonctionne maintenant. Très heureux. Merci!