从2个逻辑变量创建分组变量

时间:2015-02-23 21:43:53

标签: r

我正在尝试根据两个逻辑变量agreementx的四种可能结果创建一个新变量y。我使用的代码如下,但我知道必须有更好的方法来执行此操作。有任何想法吗?

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)

3 个答案:

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

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

答案 2 :(得分:0)

此解决方案使用预定义的地图&#39;数据框:

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
# ...