2016-05-11 12 views
0

Ich muss ein paar Faktorvariablen rekodieren, aber ich versage immer weiter.Bedingte Umcodierung des Faktors

meine Daten das sieht aus wie Angenommen:

df <- data.frame(a = c("1","2","","Other"), 
       b = c("3","","Other","Other"), 
       v1 = c("no","no","yes","yes"), 
       v2 = c("no","yes","no","no"), 
       v3 = c("no","yes","yes","no")) 
df$a <- as.character(df$a) 
df$b <- as.character(df$b) 

df 

>  a  b v1 v2 v3 
> 1  1  3 no no no 
> 2  2  no yes yes 
> 3  Other yes no yes 
> 4 Other Other yes no no 

Ich möchte

v1"yes" if (a=="1" | b=="1") sein,

v2"yes" if (a=="2" | b=="2") und

v3"yes" if (a=="3" | b=="3") sein zu sein.

So ist das Muster:

v#"yes" if (a="#" | b="#") zu sein.

Ich habe versucht, mit R Basis 2 Loops, aber es hat nicht funktioniert:

for(i in c("a","b")){ 
    for(j in as.character(1:3)){ 
    df[which(df[,i]==j),][,c(paste("v",j,sep=""))] <- "yes" 
    }} 

Ich würde dies mit dplyr::mutate bevorzugen, aber nicht wissen, wie ...

+0

Sie können einen si verwenden ngle loop 'df [paste0 (" v ", 1: 3)] <- lapply (as.zeichen (1: 3), funktion (i) ifelse (df $ a == i & df $ b == i," ja ", NA))' – akrun

+0

von '|' Ich meine 'oder' –

+0

Ist das Muster immer gleich? d.h. für v1, a = 1 | b = 1, für v2a = 2 | b = 2 usw. ...? – Sotos

Antwort

1
library(data.table) 
dt = as.data.table(df) # or convert in-place using setDT 

for (i in 1:3) dt[a == i | b == i, paste0('v', i) := 'yes'] 
#  a  b v1 v2 v3 
#1:  1  3 yes no yes 
#2:  2  no yes yes 
#3:  Other yes no yes 
#4: Other Other yes no no 
-1

dies in Fall, da die Anzahl der Variablen relativ klein ist, eine einfache Gruppe von ifelse würde lösen das Problem:

df$v1<- ifelse(df$a==1 |df$b==1,"yes","no") 
df$v2<- ifelse(df$a==2 |df$b==2,"yes","no") 
df$v3<- ifelse(df$a==3 |df$b==3,"yes","no") 
+0

in der Tat hat meine reale Datenmenge eine viel höhere Anzahl von Variablen. Ich habe das Beispiel kompakter gemacht. Hardcoding für jede Variable ist keine Option für mich. –

+0

Außerdem überschreibt Ihr Code df [3,3] von "Ja" zu "Nein", was ich nicht machen möchte. Ich möchte nur die 'v' Variablen mit dem" Ja "in der erklärten Bedingung aktualisieren. –