我想在数据框中创建一个新列,它将三个变量相乘,然后除以另外三个变量。如果除法变量等于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))))))))
没有错误出现,它只是吐出与上面相同的输出(这不是我想要的)。
可能有一种更简单的方法(我很乐意听到),但我也想知道为什么'&'不起作用,如果有任何可行的。很多谷歌搜索没有任何有用的东西。非常感谢你
答案 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
除以b
,c
将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
如果您不想修改列,请复制它们,进行替换,然后删除副本。