一个数字在一列中,一个指数,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
答案 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
表示它首先要做的是将数据帧转换为矩阵。如果你有混合数据类型,它们都将被强制,在这种情况下是字符。
简单的矢量化解决方案几乎总是优选的。