Je souhaite créer une nouvelle colonne z basée sur les valeurs de x et y. Si x>y, z=y sinon z=x.

x  y  
3  4 
5  2
6  6
1  7
9  4

Sortie requise:

x  y  z
3  4  3
5  2  2
6  6  6
1  7  1
9  4  4
r
0
Gada 30 mai 2020 à 12:22

3 réponses

Meilleure réponse

Vous pouvez utiliser ifelse:

df$z <- with(df, ifelse(x > y, y, x))
#Or without with
#df$z <- ifelse(df$x > df$y, df$y, df$x)
df

#  x y z
#1 3 4 3
#2 5 2 2
#3 6 6 6
#4 1 7 1
#5 9 4 4

Dans dplyr, vous pouvez utiliser if_else qui est le même que ci-dessus ou case_when qui est utile lorsque vous devez lister plusieurs conditions.

library(dplyr)
df %>% 
 mutate(z = case_when(x > y ~ y,
                      TRUE ~x))
1
Ronak Shah 30 mai 2020 à 09:24

Similaire à une autre réponse mais utilisant data.table et pmin:

library(data.table)
dt <- data.table(x = c(3,5,6,1,9), 
                 y = c(4,2,6,7,4))

dt[, z:= pmin(x,y)]
dt

# x y z
# 1: 3 4 3
# 2: 5 2 2
# 3: 6 6 6
# 4: 1 7 1
# 5: 9 4 4

La fonction pmin renvoie les minima parallèles (https: / /www.rdocumentation.org/packages/mc2d/versions/0.1-17/topics/pmin)

0
Kenneth Benavides 30 mai 2020 à 14:12

Si je comprends bien, vous recherchez une valeur minimale sur plusieurs colonnes. Vous pouvez utiliser la fonction pmin :

library(dplyr)
df <- data.frame(x = c(3,5,6,1,9), 
                 y = c(4,2,6,7,4))

df <- df %>% mutate(z = pmin(x, y))

Résultat:

> df
  x y z
1 3 4 3
2 5 2 2
3 6 6 6
4 1 7 1
5 9 4 4

Il comptera la valeur minimale dans un bloc de données par ligne et simplifiera la syntaxe si vous souhaitez inclure plus de 2 colonnes:

df <- data.frame(x = c(3, 5, 6, 1, 9), 
                 y = c(4, 2, 6, 7, 4),
                 a = c(2, 5, 7, 3, 3))

df <- df %>% mutate(z = pmin(x, y, a))

Résultat:

> df
  x y a z
1 3 4 2 2
2 5 2 5 2
3 6 6 7 6
4 1 7 3 1
5 9 4 3 3
0
Андрій zOFsky 30 mai 2020 à 09:57
62100400