2013-04-24 52 views
1

我有5個變量,var1var2等,這都被編碼成這樣:結合幾個二元變量

Factor w/ 2 levels "no","yes": 2 1 1 2 1 2 1 1 1 1 ... 

我想將它們合併成一個。到目前爲止,我只使用:

comb_drug <- with(dt1,interaction(var1, var2, var2, var4, var5)) 

它給出了一個32級的變量。我現在想創建一個變量具有以下3個層次:

  • 所有5是
  • 任何4是
  • 不到4是

什麼是最好的方式去做這個 ?下面是一些示例數據:

var1 <- as.factor(c(2,2,1,2,2,1,2,1,2,2)) 
var2 <- as.factor(c(2,1,2,2,2,1,2,2,2,2)) 
var3 <- as.factor(c(2,2,1,2,2,2,2,2,1,2)) 
var4 <- as.factor(c(2,2,1,2,2,2,2,2,1,2)) 
var5 <- as.factor(c(2,2,2,1,2,1,2,1,1,2)) 

dt <- data.frame(var1,var2,var3,var4,var5) 

for (i in 1:5) { 
    levels(dt[,i]) <- c("no","yes") 
} 

    var1 var2 var3 var4 var5 
1 yes yes yes yes yes 
2 yes no yes yes yes 
3 no yes no no yes 
4 yes yes yes yes no 
5 yes yes yes yes yes 
6 no no yes yes no 
7 yes yes yes yes yes 
8 no no yes yes no 
9 yes yes no no no 
10 yes yes yes yes yes 

我反而喜歡

newvar 
1 allyes 
2 4yes 
3 lessthan4yes 
4 4yes 
5 allyes 
6 lessthan4yes 
7 allyes 
8 lessthan4yes 
9 lessthan4yes 
10 allyes 

回答

2

這應該讓你對你的方式...只是加起來的「是」每行值數:

dt$newvar <- apply(dt, 1, function(x) sum(x == "yes")) 
dt$newvar 
# [1] 5 4 2 4 5 2 5 3 2 5 

從那裏,你可以做一些聰明的保理,以得到你所需要的......或者這個可能是足夠你的目的。

其實,rowSums會快很多可能:

dt$newvar <- rowSums(dt == "yes") 
3

的選擇,如果你從所有數據中減去1這可能是略快於apply(x,1,sum)rowSums

dt$nYes <- rep(c('<4','4','all'),times = c(3,1,1))[rowSums(dt=='yes')] 
1

,你會有零和一個,這可以直接解釋爲TRUE/FALSE,這使得軟件運動員更快樂:-)。作爲額外的獎勵,對於T/F(或1和0)的某些向量,sum(myvector)可直接爲您提供TRUE的數量。 在這一點上,你甚至可以有像

sum label 
0 allno 
1  one_no 
2 lessthan4yes 
3 lessthan4yes 
4 4yes 
5 yes 

查找矩陣,做直接替換爲newvec <- lutmat[lutmat[,1]==sums,2]