2016-10-07 6 views
0

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

Несколько subsettings следовать аналогичной формы для:

data_settings <- data.frame(country = rep(c('DE','RU','US','CA','BR'),6), 
          transport=rep(c('road','air','sea')), 
          category = rep(c('A','B'))) 

И мое озеро данных экстракт имеет форму, как:

df <- data.frame(country = rep(unique(data_settings$country),6), 
       transport = rep(unique(data_settings$transport),10), 
       category = rep(c('A','B'),15), 
       values = round(runif(30) * 10)) 

мне нужно подмножество данных по каждому из строк в моем кадре данных data_settings, поэтому я построил цикл, который строит формулу в соответствии с тем, что находится в моем фрейме данных data_settings.

for(i in 1:nrow(data_settings)){ 
    sub_string <- paste0(names(data_settings[1]), '==', data_settings[i,1]) 
    for(j in 2:ncol(data_settings)){ 
    col <- names(data_settings)[j] 
    val <- as.character(data_settings[i,j]) 
    sub_string <- paste0(sub_string, ' & ', col," == ","'",val,"'") 
    } 
    df_sub <- subset(df, formula(sub_string)) 
} 

Это успешно строит свои строки, которые я пытаюсь перейти к formula или as.formula, но я получаю сообщение об ошибке в этой точке. Я пробовал несколько разных формулировок без каких-либо успехов. В моем фактическом случае есть тысячи комбинаций с разными столбцами и значениями для фильтрации.

Заранее благодарим за вашу помощь!

ответ

0

Попробуйте это:

merge(data_settings, df) 
+0

Это работает так, как я раньше даже не рассматривал, но он немного медленнее, чем ожидалось. – hubbs5

+0

Вы можете попробовать слияние данных.table, чтобы узнать, если он быстрее: 'library (data.table); merge (data.table (data_settings, key = names (data_settings)), df) ' –

0

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

for(i in 1:nrow(data_settings)){ 
    df_sub <- df 
    for(j in 1:ncol(data_settings)){ 
    col <- names(data_settings)[j] 
    val <- as.character(data_settings[i,j]) 
    df_col <- grep(col, names(df)) 
    df_sub <- df_sub[df_sub[,df_col] == val,] 
    } 
    # Run further analysis here... 

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