2015-06-26 3 views
0

У меня вопрос, который кажется довольно простым, но я не могу найти для него решение.Как подмножить фрейм данных и применять одну и ту же функцию снова и снова?

У меня есть структура данных с 57 странами и их ВВП за 20 лет (всего 1140 наблюдений). Я хочу применить фильтр HP от пакета mFilter в каждой стране, а затем сохранить каждый результат как новую переменную. Например:

df <- read.csv("QNA_26062015181325399.csv") 

usa <- subset(df, Country == "United States", select = c("TIME", "Value")) 

usa.filtered <- hpfilter(usa$Value, type = "lambda", freq = 1600)) 

Проблема в том, что мне нужно повторить эту процедуру для каждой страны. Могу ли я автоматизировать этот процесс без необходимости вводить один и тот же код 57 раз?

+0

вы можете принять во внимание пакет 'plyr', который является практическим применением процедуры split-apply-comb. [Здесь] (http://www.jstatsoft.org/v40/i01/paper) вы можете найти статью об этой процедуре с примером этого пакета. – SabDeM

ответ

1

Вы можете разделить ваши данные по странам и lapply функции

lapply(split(df[,c("TIME", "Value")], df$Country), 
    function(x) hpfilter(x$Value, type = "lambda", freq = 1600) 
) 
+0

'by' также является хорошей комбинацией' split' + 'lapply' –

+0

Есть ли способ быстро сохранить каждую новую генерируемую фильтрованную серию в качестве новой переменной? –

+0

@DPinto Вы должны сохранить их в списке вместо новой переменной –

0

Если вы хотите использовать plyr попробовать:

library("plyr") 
f = function(x) { 
    hpfilter(x$Value, type = "lambda", freq = 1600) 
} 
dlply(df[, c("TIME", "Value", "Country")], .(Country), f) 
+0

Обратите внимание, что если промежуточный data.frame не хранится, то нет точки подмножества TIME, Value и Country. –

0

Это plyr решение:

library("plyr") 
hpList <- dlply(df, .(Country), function(x) hpfilter(x$Value, type = "lambda", freq = 1600)) 

В качестве альтернативы вы можете сначала разбить данные, а затем обработать их:

countryData <- dlply(df, .(Country), `[` , j = c("TIME", "Value")) 
hpList <- llply(countryData, function(x) hpfilter(x$Value, type = "lambda", freq = 1600)) 
Смежные вопросы