我想在R公式中对每个RHS变量进行对数转换。
f <- x ~ y
f1 <- update(f, . ~ . + z)
update(f, log(.) ~ log(.))
## log(x) ~ log(y)
update(f1, log(.) ~ log(.))
## log(x) ~ log(y + z)
我真正想要的是log(x) ~ log(y) + log(z)
。
答案 0 :(得分:1)
也许转换为&#34;字符&#34;,插入&#34; log&#34;,然后返回&#34;公式&#34;:
> f <- x ~ y
> f1 <- update(f, . ~ . + z)
> a <- sapply(all.vars(f1),function(x){sprintf("log(%s)",x)})
> f2 <- as.formula(paste(a[1],paste(a[-1],collapse="+"),sep="~"))
> f
x ~ y
> f1
x ~ y + z
> f2
log(x) ~ log(y) + log(z)
>
不幸的是,如果RHS已经包含一个函数,那么这不起作用:
> f1 <- update(f, . ~ . + z + exp(v))
> a <- sapply(all.vars(f1),function(x){sprintf("log(%s)",x)})
> f2 <- as.formula(paste(a[1],paste(a[-1],collapse="+"),sep="~"))
> f1
x ~ y + z + exp(v)
> f2
log(x) ~ log(y) + log(z) + log(v)
>
但这有效:
f1 <- update(x ~ y, . ~ . + z + exp(v))
a <- strsplit(as.character(f1),"\\+|~")
b <- sapply(a,function(x){sprintf("log(%s)",x)})
f2 <- as.formula(paste(b[1],paste(b[-1],collapse="+"),sep="~"))
## log(x) ~ log(y) + log(z) + log(exp(v))