2017-05-15 2 views
0

J'ai une base de données appelée dfData dans R comme ci-dessous;Valeur de mise à jour conditionnelle

x y 
10 A 
20 B 
30 C 
40 D 

J'essaie de réaliser ce qui suit;

si la valeur X est 10, mettez à jour la valeur de « XYZ »

Y at-il une fonction ou façon élégante de le faire en R? Essayer d'éviter plusieurs instructions ifelse.

Merci

+0

Avez-vous besoin d'un seul remplacement? Ou y a-t-il beaucoup plus de valeurs que vous voulez changer? –

+0

Selon votre description, vous n'avez pas besoin * multiple * ifelse. Juste un. Sinon, vous pouvez utiliser 'replace' – Sotos

+0

Pour l'élégance, il y a' DT [x == 10, y: = "XYZ"] 'lors de l'utilisation de data.table. Alternativement, oui, 'replace' n'est pas mauvais:' transform (DF, y = remplacer (y, x == 10, "XYZ")) 'ou quelque chose. Si vous avez plus de valeurs à assigner conditionnellement, il y a une "jointure de mise à jour" avec data.table ... http://franknarf1.github.io/r-tutorial/_book/tables.html#joins-update poster un exemple plus complet pour cela, cependant. – Frank

Répondre

0

Si vous devez remplacer plusieurs valeurs y en fonction des valeurs de x, une approche posible est:

# define df as data.table 
library(data.table) 
df <- data.table(x=c(10,20,30,40,50,60,70,80,90), y= c('A', 'B', 'C', 'D','A', 'B', 'C', 'D', 'A')) 

> df 
    x y 
1: 10 A 
2: 20 B 
3: 30 C 
4: 40 D 
5: 50 A 
6: 60 B 
7: 70 C 
8: 80 D 
9: 90 A 

# define your pair of values for replacement 
a <- c(10,20,50) 
b <- c('XYZ', 'ZYX', 'AAA') 

# x = 10 will cause y to be replaced by 'XYZ', x= 20 will cause y to be replaced by 'ZYX' and so on ... 

# replacement 

for (i in 1:length(a)) { 
    df[ x==a[i], y := b[i]] 
} 

> df 
    x y 
1: 10 XYZ 
2: 20 ZYX 
3: 30 C 
4: 40 D 
5: 50 AAA 
6: 60 B 
7: 70 C 
8: 80 D 
9: 90 A 

vecteurs a et b pourrait avoir une longueur, mais ont besoin d'être jumelé avec une valeur x et la valeur y.

0
x <- c(10,20,30,40) 

y <- c("a", "b", "c", "d") 

df1 <- data.frame(x,y) 


df1$y <- as.character(df1$y) 

Now we get the data frame as you want: 

> df1 
    x y 
1 10 a 
2 20 b 
3 30 c 
4 40 d 

> df1[which(df1$x==10),2] <- 'xyz' 

This produces: 

> df1 
    x y 
1 10 xyz 
2 20 b 
3 30 c 
4 40 d 
+0

merci, mais dans mon cas c'est la même valeur que je veux mettre à jour ... je veux essentiellement 10 à devenir xyz. – femi