2016-12-09 1 views
0

J'essaie de recoder une variable basée sur deux autres variables et je pense que je ne comprends pas comment fonctionne l'instruction ifelse.Ne pas comprendre l'instruction ifelse

J'ai une colonne qui est une chaîne et l'autre est un nombre entier. Je veux que la nouvelle colonne soit identique à la chaîne c1, sauf si la colonne entière flag est égale à 1, auquel cas elle sera égale à XX.

c1  flag EXPECTED OUTPUT 
    SS   0   SS 
    SS   1   XX 
    MM   0   MM 
    LL   0   LL 
    LL   0   LL 
    SS   1   XX 
    LL   0   LL  
    LL   1   XX 
    SS   0   SS 

J'utilise ifelse comme tel:

df$expectedoutput <- ifelse(df$flag==1, "XX", df$c1) 

Je ne suis pas sûr que ce soit la meilleure façon de faire un recodage.

Quand je demande à voir la nouvelle colonne que je reçois cette erreur:

Error in View : 'names' attribute [1849] must be the same length as the vector [1] 
+5

Quel est le problème avec la sortie de courant exactement? – Joe

+0

Vous avez probablement une variable facteur et pas une chaîne. – lmo

+0

Quand je mets 'df $ string <- as.character (df $ string)' J'ai le même problème. –

Répondre

1

je crois que vous avez été mordu par stringsAsFactors=TRUE. Cela semble donner la sortie attendue:

df <- read.table(text=" 
c1  flag 
SS   0 
SS   1 
MM   0 
LL   0 
LL   0 
SS   1 
LL   0  
LL   1 
SS   0", header=TRUE, stringsAsFactors=FALSE) 

df$expected <- ifelse(df$flag == 1, "XX", df$c1) 

> df 
    c1 flag expected 
1 SS 0  SS 
2 SS 1  XX 
3 MM 0  MM 
4 LL 0  LL 
5 LL 0  LL 
6 SS 1  XX 
7 LL 0  LL 
8 LL 1  XX 
9 SS 0  SS