2013-08-26 2 views
2

Я хочу обобщить очень большую таблицу данных, применяя список статистических функций к каждому столбцу. Я хочу использовать data.table, поскольку предыдущая версия с plyr работала, но довольно медленно, и я читал, что это должно быть намного быстрее. Я попытался следующие, но я получаюПрименить список функций для каждого столбца data.table в R

Error in { : 
task 1 failed - "task 1 failed - "second argument must be a list"" 

Вот функции я попытался

library(data.table) 
library(e1071) 
library(nortest)  

statistical_tests = list(mean, sd, kurtosis, skewness, 
         lillie.test, shapiro.test)   

summary = function(column) { 
    result = mapply(do.call, statistical_tests, column) 
    print(result) 
    return(result) 
} 

analyse_fits = function(fit_df) { 
    #get mean and standard deviation for the three parameters 
    print(fit_df) 
    setkey(fit_df, type) 
    return(fit_df[, lapply(.SD, summary), 
     by=type]) 
}         

analyse_fits(fit_df) 

пример данных для fit_df:

constant   phase visibility type 
1: 49927.22 -2.609797e-03 0.8690605 fft 
2: 49965.89 -6.783609e-05 0.8702492 fft 
3: 50026.44 -1.109387e-03 0.8680235 fft 
4: 50063.78 2.640915e-04 0.8697564 fft 
5: 50074.89 9.999202e-04 0.8684974 fft 
6: 49964.89 -2.075373e-03 0.8708830 fft 
7: 50063.56 -9.737554e-04 0.8721360 fft 
8: 50044.11 -1.920089e-03 0.8722035 fft 
9: 50100.67 -7.487811e-04 0.8706438 fft 
10: 49962.11 4.163415e-03 0.8713016 fft 
11: 49926.63 -1.473941e-03 0.8687753 ls 
12: 49964.98 1.794244e-03 0.8710003 ls 
13: 50025.89 -1.315459e-03 0.8698475 ls 
14: 50063.40 2.891339e-04 0.8699723 ls 
15: 50074.70 1.859353e-03 0.8684841 ls 
16: 49964.43 -6.426037e-04 0.8706581 ls 
17: 50063.47 -1.646874e-03 0.8715316 ls 
18: 50043.48 -1.435637e-03 0.8713584 ls 
19: 50100.36 -2.261318e-03 0.8699203 ls 
20: 49961.76 3.659428e-03 0.8704063 ls 

Я уверен, что есть хороший способ форматирования выход, чтобы заставить его работать, можете ли вы мне помочь?

+0

Как сказал Карл, кажется, что вы вызываете одну из функций неправильно. Для функций 'base' это все равно работает:' DT [, c (list (stat = c ('mean', 'sd')), lapply (.SD, function (x) c (mean (x)), sd (x)))), by = type] .' – Frank

ответ

1

Во-первых: используйте traceback(), чтобы узнать, какую функцию вы вызываете неправильно. Это поможет вам правильно форматировать входные данные.

Во-вторых: если вы всегда вызываете один и тот же набор функций статистики, будет проще просто написать функцию «обертка» (см., Например, мою игрушку cgwtools::mystat), которая в явном виде вызывает каждую функцию статистики по очереди.

1

Я объединил подходы Фрэнка и Карла, чтобы написать именованную функцию-оболочку и список имен, и добавить столбец «stat», который, я думаю, является опрятной идеей.

statistical_tests = function(x) { 
    return(c(
       mean(x), 
       sd(x), 
       kurtosis(x), 
       skewness(x), 
       lillie.test(x)$p.value, 
       shapiro.test(x)$p.value)) 
} 

names = c("mean", "sd", 
     "kurtosis", "skewness", 
     "normality.p.value.lilliefors", 
     "normality.p.value.shapiro") 

analyse_fits = function(fit_df) { 
    #get mean and standard deviation for the three parameters 
    setkey(fit_df, type) 
    result = fit_df[, c(list(stat=names), lapply(.SD, statistical_tests)), by=type] 
    setkeyv(result, c("stat", "type")) 
    return(result) 
}          
+0

+1 Я не запускал или не тестировал, а просто смотрел на него, для скорости обычно лучше всего держать 'j' как можно проще и вынимать любые константы от него (например, 'stat = names' часть), а затем изменить имя/имя впоследствии. Или, может быть, просто посмотрите, насколько быстрее 'fit_df [, lapply (.SD, statistics_tests), by = type]' сначала увидеть, стоит ли переупорядочивать его. –

Смежные вопросы