2014-11-14 2 views
0

У меня есть вектор с оптимальной лямбдой для преобразования кокса. Это мой лямбда вектор:Применение преобразования Box-Cox к кадру данных с другой лямбда для каждого столбца

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 

и т.д ...

Тогда у меня есть функция, которая вычисляет Бокса-Кокса преобразования в для столбца:

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

'mapply (Ьс, ДФ, лямбда $ lambda) '.... и обратите внимание, что дробные степени отрицательных чисел часто являются проблемой. –

ответ

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 
+0

Кажется, что работает только на вашем наборе данных – Michal

+0

, что кажется неправильным, когда вы используете свой DataFrame? – keegan