2017-04-11 42 views
-2

我有一個數據幀,看起來像這樣:重新編碼多響應變量爲一箇中的R

Df <- data.frame(
     mn = c(1,0,1,1,1,1,0), 
     bc = c(1,1,1,0,0,1,1), 
     bn = c(0,0,1,1,0,1,0)) 

我要重新編碼到這些新的變量。

我想是這樣的

Df$Var[which(Df$mn %in% 1)] <- "mn" 
Df$Var[which(Df$bc %in% 1)] <- "bc" 
Df$Var[which(Df$bn %in% 1)] <- "bn" 

這工作,但我沒有得到5個MNS,5個BCS和BNS 3。它看起來像一個命令覆蓋另一個。我知道這樣的事情在SPSS中是可能的。它將它們自動合併。我的問題是我怎樣才能做到這一點,而不是在任何壓倒一切R.

+0

假設你有一個'$ Df的列Var',每行,如果滿足條件取決於每一次將其覆蓋。你的預期產出是多少? – SymbolixAU

+0

你的問題不是很清楚。你是說在你的新變量中,它不應該覆蓋是否已經有一個值?這個例子的結果會是什麼樣子? – thc

+0

嗯,我看到覆蓋,這就是我想要防止的。我現在的困境是在mn,bc和bn都是1的區域,我如何告訴R變量Var可以取任何這些值。說'Df $ Var [3]'可以是mn,bn或bn。如果我正在計數bcs,則應該計算在內,如果我計算的是mns,則應該計數,如果我計算bns,則應該再計算一次。 – Kay

回答

1
Df$mn[which(Df$mn %in% 1)] <- "mn" 
Df$bc[which(Df$bc %in% 1)] <- "bc" 
Df$bn[which(Df$bn %in% 1)] <- "bn" 

我相信這是你想要的。

如果你想新的欄目,然後:

Df <- data.frame(
     mn = c(1,0,1,1,1,1,0), 
     bc = c(1,1,1,0,0,1,1), 
     bn = c(0,0,1,1,0,1,0)) 
Df1<-Df 
Df1$mn[which(Df1$mn %in% 1)] <- "mn" 
Df1$bc[which(Df1$bc %in% 1)] <- "bc" 
Df1$bn[which(Df1$bn %in% 1)] <- "bn" 
Df<-cbind(Df,Df1) 
1
Df$Var <- apply(Df, 1, function(r) {paste(names(Df)[r == 1], collapse=" ")}) 

# mn bc bn  Var 
# 1 1 1 0 mn bc 
# 2 0 1 0  bc 
# 3 1 1 1 mn bc bn 
# 4 1 0 1 mn bn 
# 5 1 0 0  mn 
# 6 1 1 1 mn bc bn 
# 7 0 1 0  bc 
+2

與@SymbolixAU同樣的答案 – epi99

1

類似別人沒有哪個(),%在%,或cbind()返回,雖然使用:

Df <- data.frame(
    mn = c(1,0,1,1,1,1,0), 
    bc = c(1,1,1,0,0,1,1), 
    bn = c(0,0,1,1,0,1,0)) 

Df$Var1[Df$mn == 1] <- "mn" 
Df$Var2[Df$bc == 1] <- "bc" 
Df$Var3[Df$bn == 1] <- "bn" 
0
DF %>% tidyr::gather("var", "value", 1:3) %>% 
dplyr::mutate(var1 = ifelse(value==1, var, " ")) 

或者

Df %>% dplyr::mutate(mn1 = ifelse(mn==1, "mn", " "), 
        bc1 = ifelse(bc==1, "bc", " "), 
        bn1 = ifelse(bn==1, "bn", " ")) 

> Df 
    mn bc bn mn1 bc1 bn1 
1 1 1 0 mn bc  
2 0 1 0  bc  
3 1 1 1 mn bc bn 
4 1 0 1 mn  bn 
5 1 0 0 mn   
6 1 1 1 mn bc bn 
7 0 1 0  bc