2015-02-23 95 views
1

我試圖根據兩個邏輯變量xy的四個可能結果創建一個新變量agreement。我使用的代碼如下,但我知道必須有更好的方式去做這件事。有任何想法嗎?從2個邏輯變量創建分組變量

mydata$agreement <- NA 
mydata$agreement[!mydata$x & !mydata$y] <- 0 
mydata$agreement[!mydata$x & mydata$y] <- 1 
mydata$agreement[mydata$x & !mydata$y] <- 2 
mydata$agreement[mydata$x & mydata$y] <- 3 
mydata$agreement <- factor(mydata$agreement, 
          levels=c(0, 1, 2, 3), 
          labels=c("label 1", "label 2", "label 3", "label 4"), 
          ordered=FALSE) 

回答

2

這裏是一個稍微簡單的解決方案:

mydata$agreement <- mydata$x + mydata$y*10 
mydata$agreement <- factor(mydata$agreement, 
         levels=c(0, 1, 10, 11), 
         labels=c("label 1", "label 2", "label 3", "label 4"), 
         ordered=FALSE) 
2

下面是一個簡單的解決方案,傳達的意圖:

# dummy data: 
x <- sample(c(TRUE, FALSE), 100, replace=T) 
y <- sample(c(TRUE, FALSE), 100, replace=T) 

z <- factor(ifelse(x & y, 3, ifelse(x, 2, ifelse(y, 1, 0))), 
      levels=c(0, 1, 2, 3), 
      labels=c("label 1", "label 2", "label 3", "label 4"), 
      ordered=FALSE) 

> table(z) 
z 
label 1 label 2 label 3 label 4 
    29  29  17  25 

> table(x, y) 
     y 
x  FALSE TRUE 
    FALSE 29 29 
    TRUE  17 25 
0

將該溶液利用預定義的「地圖」的數據幀的:

z <- data.frame(x=c(F,F,T,T), y=c(F,T,F,T),agreement=paste('label',1:4)) 
#  x  y agreement 
# 1 FALSE FALSE label 1 
# 2 FALSE TRUE label 2 
# 3 TRUE FALSE label 3 
# 4 TRUE TRUE label 4 

merge

merge(d,z,by=c('x','y')) 
#  x  y a agreement 
# 1 FALSE FALSE e label 1 
# 2 FALSE TRUE c label 2 
# 3 FALSE TRUE d label 2 
# 4 FALSE TRUE b label 2 
# 5 FALSE TRUE g label 2 
# 6 FALSE TRUE h label 2 
# 7 TRUE FALSE a label 3 
# 8 TRUE FALSE j label 3 
# 9 TRUE TRUE i label 4 
# 10 TRUE TRUE f label 4 

其中d是一個示例數據幀:

d <- data.frame(x=sample(c(T,F),10,replace=T),y=sample(c(T,F),10,replace=T),a=letters[1:10]) 
#  x  y a 
# 1 TRUE FALSE a 
# 2 FALSE TRUE b 
# 3 FALSE TRUE c 
# ...