2015-12-08 72 views
0

我需要用另一個變量替換一個變量的值,如下所示。我被絆倒在R如何處理因素。有條件地替換因子值

# setup example 
df1 <- data.frame(v1=c(1, 0, 1, 1), 
        v2=c(1, 1, 1, 1)) 
df1$v1 <- factor(df1$v1, 
       levels=c(0, 1), 
       labels=c("0", "1")) 

df2 <- data.frame(v3=c(1, NA, NA, 0), 
        v4=c(1, 1, 1, 1)) 
df2$v3 <- factor(df2$v3, 
       levels=c(0, 1), 
       labels=c("0", "1")) 

# df2$v3 
#[1] 1 <NA> <NA> 1 
#Levels: 0 1 

# recode NA in df2$v3 to 0 if df1$v1==0 
# df2$v3 should end up as 1, 0, NA, 1 and remain a factor 

df2$v3 <- ifelse(df1$v1=="0" & is.na(df2$v3), "0", df2$v3) 

# df2$v3 
#[1] "2" "0" NA "2" 
+0

嘗試,'ifelse(DF1 $ V1 = = 「0」 &is.na(DF2 $ V3), 「0」,as.character(DF2 $ V3))' –

+0

感謝,@ RonakShah,但我需要變量保持一個因子。 –

+0

您可以稍後將其轉換爲因子,也許'as.factor(ifelse(df1 $ v1 ==「0」&is.na(df2 $ v3),「0」,as.character(df2 $ v3)))' –

回答

0
# setup example 
df1 <- data.frame(v1=c(1, 0, 1, 0), 
        v2=c(1, 1, 1, 1)) 
df1$v1 <- factor(df1$v1, 
       levels=c(0, 1), 
       labels=c("0", "1")) 

df2 <- data.frame(v3=c(1, NA, NA, 0), 
        v4=c(1, 1, 1, 1)) 
df2$v3 <- factor(df2$v3, 
       levels=c(0, 1), 
       labels=c("0", "1")) 
df2$v3[which(df1$v1==0)] <- 0 

sapply(df2,class) 
#  v3  v4 
# "factor" "numeric" 
+0

謝謝,@nathanesau。這似乎沒有考慮到條件'is.na()'。它發生在原始玩具的例子中,所以我修改了'df1 $ v1'(1,0,1,1)來表明這一點。 –

+0

我糾正了這個例子中的另一個錯誤。如果擴展到'df2 $ v3 [which(df1 $ v1 == 0&is.na(df2 $ v3))] < - 0', –