web-dev-qa-db-fra.com

Créer une nouvelle colonne basée sur 4 valeurs dans une autre colonne

Je veux créer une nouvelle colonne basée sur 4 valeurs dans une autre colonne.

if col1=1 then col2= G;
if col1=2 then col2=H;
if col1=3 then col2=J;
if col1=4 then col2=K.

COMMENT PUIS-JE FAIRE CELA EN R? S'il vous plaît, j'ai besoin de quelqu'un pour aider à résoudre ce problème. J'ai essayé if/else et ifelse mais aucun ne semble fonctionner. Merci

24
nolyugo

Vous avez un cas particulier de recherche de valeurs où l'index est un nombre entier 1: 4. Cela signifie que vous pouvez utiliser l'indexation vectorielle pour résoudre votre problème en une seule étape facile.

Créez d'abord quelques exemples de données:

set.seed(1)
dat <- data.frame(col1 = sample(1:4, 10, replace = TRUE))

Ensuite, définissez les valeurs de recherche et utilisez [ sous-ensemble pour trouver les résultats souhaités:

values <- c("G", "H", "J", "K")
dat$col2 <- values[dat$col1]

Les resultats:

dat
   col1 col2
1     2    H
2     2    H
3     3    J
4     4    K
5     1    G
6     4    K
7     4    K
8     3    J
9     3    J
10    1    G

Plus généralement, vous pouvez utiliser [ sous-ensemble combiné avec match pour résoudre ce type de problème:

index <- c(1, 2, 3, 4)
values <- c("G", "H", "J", "K")
dat$col2 <- values[match(dat$col1, index)]
dat
   col1 col2
1     2    H
2     2    H
3     3    J
4     4    K
5     1    G
6     4    K
7     4    K
8     3    J
9     3    J
10    1    G
20
Andrie

Vous pouvez utiliser un ifelse imbriqué:

col2 <- ifelse(col1==1, "G",
        ifelse(col1==2, "H",
        ifelse(col1==3, "J",
        ifelse(col1==4, "K",
                        NA  )))) # all other values map to NA

Dans ce cas simple, c'est exagéré, mais pour les plus compliqués ...

26
Marek

Il existe plusieurs façons de procéder, mais en voici une.

set.seed(357)
mydf <- data.frame(col1 = sample(1:4, 10, replace = TRUE))
mydf$col2 <- rep(NA, nrow(mydf))
mydf[mydf$col1 == 1, ][, "col2"] <- "A"
mydf[mydf$col1 == 2, ][, "col2"] <- "B"
mydf[mydf$col1 == 3, ][, "col2"] <- "C"
mydf[mydf$col1 == 4, ][, "col2"] <- "D"

   col1 col2
1     1    A
2     1    A
3     2    B
4     1    A
5     3    C
6     2    B
7     4    D
8     3    C
9     4    D
10    4    D

En voici un qui utilise le car de recode.

library(car)
mydf$col3 <- recode(mydf$col1, "1" = 'A', "2" = 'B', "3" = 'C', "4" = 'D')

Un autre de cette question :

mydf$col4 <- c("A", "B", "C", "D")[mydf$col1]
6
Roman Luštrik

Vous pourriez jeter un œil à ?symnum.

Dans votre cas, quelque chose comme:

col2<-symnum(col1, seq(0.5, 4.5, by=1), symbols=c("G", "H", "J", "K"))

devrait vous rapprocher.

1
Nick Sabbe