对所有RHS术语进行日志转换

时间:2016-01-04 13:32:12

标签: r formula

我想在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)

1 个答案:

答案 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))