0
votes

Remplacement conditionnel des valeurs dans une variable basée sur des valeurs dans plusieurs autres variables dans R

J'ai une ligne de code suivante qui remplace une valeur dans une variable ( var2 ) en fonction d'une valeur dans une autre variable ( var1 ) xxx

Cependant, je voudrais étendre cela et remplacer les variables (par exemple, var5 ) dans la trame de données en fonction des valeurs dans plusieurs autres variables ( var1 , var2 , var3 , var4 ) qui sont codés dans des colonnes spécifiques 13:16.

J'ai essayé xxx

qui ne fonctionnerait pas correctement et je voudrais savoir pourquoi et comment modifier de manière optimale le code.


0 commentaires

4 Réponses :


0
votes

Vous pouvez obtenir une meilleure compréhension en regardant des parties plus petites de votre code.

premier regard sur df [c (13:16)]> 0 : le résultat est une matrice avec Juste true et false dedans. En particulier, vous ne pouvez pas utiliser df $ var5 [df [c [c (13:16)]> 0] car l'objet interne est une matrice et que vous ne pouvez pas sous-ensemble vecteur avec matrice.

Alors que pouvez-vous faire? Vous pouvez utiliser appliquer pour transformer cette matrice en un vecteur: xxx

Ceci entraînera un vecteur qui contient true Si tous les éléments d'une ligne sont true et false sinon. Et enfin, vous pouvez utiliser df $ var5 [idx] <- na / code>


0 commentaires

1
votes

Tout d'abord quelques données xxx

puis pour une variable xxx

et pour plusieurs xxx < / pré>


4 commentaires

RG255, merci pour votre réponse. dt1 [v1 <0 & v2 <0 & v3 <0, v5: = na] 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] 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 & pour | (l'opérateur conditionnel "ou")


En outre, utilisez ! (Is.na (v1)) ... (ou sans la marque d'exclamation selon les besoins) pour faire face au NAS



0
votes

Voici un Tidyverse 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é: xxx

Suivant, nous sommes conditionnellement muté variable var5 var5 tel qu'il est égal à na uniquement si toutes les variables var6: var9 sont supérieures à 0 , et gardez sinon leurs valeurs d'origine: xxx

créé sur 2020-01-22 par le RepreX Package (v0.3.0)

EDIT

en fonction de votre commentaire ci-dessous, nous utilisons le | < / code> opérateur à dire "ou" au lieu de & pour dire "et". Tout d'abord, nous créons un nouveau jeu de données factices avec beaucoup d'autres 0 S à des fins de démonstration: xxx

et maintenant nous remplaçons & avec | : xxx

créé sur 2020-01-22 par le package Reprex (v0.3.0)


2 commentaires

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



2
votes

Voici une solution de base r, une modification légèrement basée sur votre code xxx pré>

Notez que 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>

donné df code> comme p> xxx pré>

alors 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


12 commentaires

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 à 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 lorsque na . 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 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 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 sur les colonnes, plutôt que & , 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!