2015-02-23 92 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 
# ...