簡體   English   中英

結合幾個二進制變量

[英]Combining several binary variables

我有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個級別的變量:

  • 全部五個都是
  • 任何四個是
  • 少於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

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

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

這應該可以讓您如願以償……只需將每行的“是”值相加即可:

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")

如果您從所有數據中減去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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM