将box-Cox变换应用于每列具有不同Lambda的数据帧

时间:2014-11-14 21:10:38

标签: r transformation lapply sapply

我有一个带有最佳lambda的向量用于盒子cox变换。这是我的lambda矢量:

lambda <- data.frame(lambda=c(0.01,0.01,0.01))
 str(lambda)
 #'data.frame':   3 obs. of  1 variable:
 #$ lambda: num  0.01 0.01 0.01

我也有数据:

df:
obs1   obs2    obs3
34.3   232.2   2.0
2.1    56.3    90.0

等...

然后我有一个函数来计算列的box-cox变换:

bc <- function (obs, lambda) {
(obs^lambda-1)/lambda }

我正在尝试将该函数应用于我的整个数据集:

 result <- as.data.frame(lapply(df, function(u) { lapply(lambda, function(v) { bc(u,v) } ) } ))

这似乎不起作用,因为我试图在一个列上单独运行它,如下所示:

d <- bc(df[,1],0.01)

然后我做了:

z <-  result[,1] == d
table(z)

导致了这个:

FALSE    TRUE
3051     2

所以基本上,两列不相等。

我不确定为什么会这样。

1 个答案:

答案 0 :(得分:2)

请考虑在此处使用mapply,以便您可以将多个参数传递给您感兴趣的函数。一个简单的例子 - 一个需要两个值的函数,我们希望从两个不同的向量遍历每一对:

twoInputFun<-function(a,b){return(a^b)}
mapply(twoInputFun,c(1:3),c(5:7))
[1]    1   64 2187

所以对你的例子来说,

df<-data.frame(x<-rnorm(10),y<-rnorm(10))
bc <- function (obs, lambda) {(obs^lambda-1)/lambda }
mapply(bc,df,c(5,10))

 [1,]     -1.1110238    -0.09995922
 [2,]     -0.1994398    -0.01196807
 [3,]     14.2708856    -0.09999996
 [4,]     -0.2195956    -0.09852122
 [5,]     -0.1996738     1.01595854
 [6,]     -0.2179283    -0.09999210
 [7,]     -0.6094362    -0.09999997
 [8,]     -0.1972702    -0.09999191
 [9,]      0.3886741    -0.10000000
[10,]     -0.2000037    25.83026050