相当于'&'对于r中的ifelse语句

时间:2016-09-19 04:41:00

标签: r

我想在数据框中创建一个新列,它将三个变量相乘,然后除以另外三个变量。如果除法变量等于0,我想把它们排除在外。所以这就是我在做的事情:

sm3$mult=ifelse(sm3$WS==0, (sm3$RF*sm3$EF*sm3$HD/sm3$M/sm3$ESF), 
            ifelse(sm3$M==0, (sm3$RF*sm3$EF*sm3$HD/sm3$WS/sm3$ESF), 
            ifelse(sm3$ESF==0,(sm3$RF*sm3$EF*sm3$HD/sm3$WS/sm3$M),
            (sm3$RF*sm3$EF*sm3$HD/sm3$WS/sm3$M/sm3$ESF)))) 

但有时候不止一个分割变量等于0,所以如果是这样的话,我想把两者都排除在外。所以我尝试了这个,但它不起作用:

sm3$mult=ifelse(sm3$WS==0, (sm3$RF*sm3$EF*sm3$HD/sm3$M/sm3$ESF), 
            ifelse(sm3$M==0, (sm3$RF*sm3$EF*sm3$HD/sm3$WS/sm3$ESF), 
            ifelse(sm3$ESF==0,(sm3$RF*sm3$EF*sm3$HD/sm3$WS/sm3$M), 
            ifelse(sm3$WS==0 & sm3$M==0,(sm3$RF*sm3$EF*sm3$HD/sm3$ESF), 
            ifelse(sm3$WS==0 & sm3$ESF==0,(sm3$RF*sm3$EF*sm3$HD/sm3$M), 
            ifelse(sm3$M==0 & sm3$ESF==0,(sm3$RF*sm3$EF*sm3$HD/sm3$WS), 
            ifelse(sm3$WS==0 & sm3$M==0 & sm3$WS==0,(sm3$RF*sm3$EF*sm3$HD), 
            (sm3$RF*sm3$EF*sm3$HD/sm3$WS/sm3$M/sm3$ESF)))))))) 

没有错误出现,它只是吐出与上面相同的输出(这不是我想要的)。

可能有一种更简单的方法(我很乐意听到),但我也想知道为什么'&'不起作用,如果有任何可行的。很多谷歌搜索没有任何有用的东西。非常感谢你

1 个答案:

答案 0 :(得分:4)

取分割列并将所有0转换为1

例如,如果您有此数据框

a = c(2,3,4,0)
b = c(5,0,2,1)
c = c(0,4,2,3)

d = data.frame(a,b,c)

> d
  a b c
1 2 5 0
2 3 0 4
3 4 2 2
4 0 1 3

并且您希望将a除以bc将b和c中的全部零替换为1

d$b[d$b==0] = 1
d$c[d$c==0] = 1

d$e = d$a/d$b/d$c

结果:

> d
  a b c    e
1 2 5 1 0.40
2 3 1 4 0.75
3 4 2 2 1.00
4 0 1 3 0.00

如果您不想修改列,请复制它们,进行替换,然后删除副本。