结合几个二进制变量

时间:2013-04-24 11:00:37

标签: r

我有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

3 个答案:

答案 0 :(得分:3)

可能比apply(x,1,sum)rowSums

略快的替代方案
dt$nYes <- rep(c('<4','4','all'),times = c(3,1,1))[rowSums(dt=='yes')]

答案 1 :(得分: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")

答案 2 :(得分:1)

如果从所有数据中减去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]