2017-09-29 4 views
1

Disons que je l'dataframe suivante:valeurs Somme des dataframe recodification certaines valeurs des variables d'origine à la volée

df <- data.frame(a=c(1,2,3,3,1), b=(c(1,9,1,2,3)), 
       c=c(1,2,3,3,9), d=(c(1,2,3,9,1))) 

Je voudrais résumer les valeurs de a + b + c + d, mais tous les le temps que l'une de ces variables a une valeur de 9, je voudrais résumer 3 au lieu de 9.

Je sais que je peux le faire en re-codifiant chacune des variables en utilisant la syntaxe suivante:

df[,1:4][df[,1:4]==9]<-3

mais je voudrais le faire avec une table temporaire ou un code qui me permet d'ignorer cette étape. En plus de cela, je ne veux pas manquer la valeur originale de chaque variable, parce que les 9 auront une signification pour les autres opérations que je dois faire.

Ce serait le résultat que je voudrais avoir:

df$sum <- c(4,9,10,11,8) 

Merci beaucoup,

Yatrosin

Répondre

1

Une option serait de replace éléments ayant des valeurs supérieures ou égales à 9 avec 3 et obtenez le rowSums

df$Sum <- rowSums(replace(df[1:4], df[1:4] >= 9, 3)) 
df$Sum 
#[1] 4 9 10 11 8 
+1

d spécifiez explicitement les colonnes, car si vous l'exécutez de manière répétée dans une session interactive, cela fera des choses bizarres. Je veux dire avec 'df [1: 4]' (ou mieux, en utilisant des noms) au lieu de 'df'. – Frank

+0

Oui, bien sûr, c'était juste une version simplifiée du code. En fait, pour certaines colonnes 9 doit être considéré comme un 3 et pour les autres, il doit être considéré comme 0. – Yatrosin

+0

@Yatrosin Si vous avez besoin de changer différentes colonnes avec des valeurs différentes, c'est-à-dire 1ère 2 colonnes avec 3 et suivantes 2 avec 0 'rowSums (do.call (cbind, Map (fonction (x, y) remplacer (x, x> = 9, y), split.default (df, rep (1: 2, chaque = 2)), c (3, 0)))) ' – akrun