1

我有 5 个变量,var1等等var2,它们都是这样编码的:

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个都是yes
  • 任何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
4

3 回答 3

3

可能比apply(x,1,sum)( rowSums)稍快的替代方案

dt$nYes <- rep(c('<4','4','all'),times = c(3,1,1))[rowSums(dt=='yes')]
于 2013-04-24T11:12:59.717 回答
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")
于 2013-04-24T11:09:56.093 回答
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] .

于 2013-04-24T13:04:53.243 回答