我正在尝试根据两个逻辑变量agreement
和x
的四种可能结果创建一个新变量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)
答案 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
# ...