将列乘以另一列中的指数

时间:2014-06-18 15:11:22

标签: r apply

一个数字在一列中,一个指数,k,m,b,...在另一列中。我正在尝试做这个产品。我愿意采取更好的方式来做到这一点。问题在于功能。它在我输入单个值时有效,但在给出列表时则无效。

exp <- function(val, exp){
     switch(exp, k=1000 * val, K=1000*val, m = 1000000 * val, M=1000000 * val,
            b=1000000000 * val, B=1000000000*val, 0)
 } 
dat <- data.frame(x=c(1,2,3), val=c(3,4,0), exp=c('k','M',''))
dat
#  x val exp
#1 1   3   k
#2 2   4   M
#3 3   0    
apply(dat[,c('val','exp')], 1, function(x) exp(x['val'], x['exp']))

#Error in 1000 * val : non-numeric argument to binary operator 

1 个答案:

答案 0 :(得分:3)

你不应该在这里使用apply

dat$val1 <- exp_list[dat$exp]
> dat
  x val exp  val1
1 1   3   k 1e+03
2 2   4   M 1e+06
3 3   0     1e+03
> with(dat,val * val1)
[1] 3e+03 4e+06 0e+00

要记住的是,如果您的2D数据结构是数据框,apply几乎总是错误的选择。请注意,?apply表示它首先要做的是将数据帧转换为矩阵。如果你有混合数据类型,它们都将被强制,在这种情况下是字符。

简单的矢量化解决方案几乎总是优选的。