我正在尝试使用if
和ifelse
在R中对以下语句进行编码。示例数据为试用版,x,y和z为试用列。
要编码的语句
if (x>0) {
if (y>0) {
l=2
}else{
l=5
}
if (z>0) {
m=l+2
}else{
m=5
}
}
使用ifelse的R代码
trial$l<-with(trial, ifelse((x>0 &y>0),2,ifelse((x>0 &y<=0),5,???)))
trial$m<-with (trial,ifelse((x>0 &z>0),l+2,ifelse((x>0 &z<=0),5,???)))
其中,???
指定根据上述语句没有值。换句话说,x<0 and y
没有值。
接下来,我使用if和ifelse的组合来查看是否有效:
if(trial$z>0){
trial$l<-with(trial, ifelse(y>0,2,5))
trial$m<-with(trial, ifelse(z>0,l+2,5))
}
此代码没问题,但有一条警告消息(因为z
是一个列向量)
In if (trial$z>0){
the condition has length>1 and only the first element will be used
我只想专注于使用ifelse
,因为我只处理向量。但是,我在这方面没有运气。有什么想法吗?
答案 0 :(得分:4)
如果你想使用ifelse和嵌套东西你可以做这样的事情
test <- data.frame(x = 2, y = 5, z = 3)
with(test, ifelse(z > 0 & x > 0 | y > 3, "yes", "no"))
在这种情况下,您使用逻辑运算符来保护输出。如果z <= 0
你仍会得到“否”,但你可以很容易地处理它。
with(test, ifelse(z > 0, ifelse(x > 0 | y > 3, "yes", "no"), NA))
嵌套ifelse
语句在任何语言中都很难被遵循,因此如果最终有3个以上的语句,请考虑匹配或切换语句。
答案 1 :(得分:2)
我会两次使用transform
例如:
trial <- data.frame(x=c(-1,1,2),y=c(1,-2,3),z=c(1,-5,5))
trial <- transform(trial,l = ifelse(x>0,ifelse(y > 0,2,5),NA))
transform(trial,m = ifelse(x>0,ifelse(z>0,l+2,5),NA))
x y z l m
1 -1 1 1 NA NA
2 1 -2 -5 5 5
3 2 3 5 2 4
请注意,我为案例x&lt;分配了NA。你可以使用这样的一个变换,例如:
trial <- data.frame(x=c(-1,1,2),y=c(1,-2,3),z=c(1,-5,5))
transform(trial,l <- ifelse(x>0,ifelse(y > 0,2,5),NA),
m = ifelse(x>0,ifelse(z>0,l+2,5),NA))
x y z c.NA..5..2. m
1 -1 1 1 NA NA
2 1 -2 -5 5 5
3 2 3 5 2 4
但我个人更喜欢第一个可读性,除了你需要改变列名的事实。