2015-06-25 2 views
0

Предполагая, что у меня есть dataframe, ДФ с этой информациейВызова рекурсивных функций в R

group wk source revenue 1 1 C 100 1 1 D 200 1 1 A 300 1 1 B 400 1 2 C 500 1 2 D 600

Я пытаюсь программно фильтровать вниз к строкам уникальных комбинаций группы, WK и источника, а затем выполнить некоторые операции над ними, прежде чем объединить их обратно в другую фреймворк. Я хочу написать функцию, которая может масштабироваться до любого количества сегментов (а не только сценария примера здесь) и фильтровать строки. Все, что мне нужно передать, будут имена столбцов, по которым я хочу сегментировать

например. seg <- c("group", "wk", "source")

Одна уникальная комбинация для фильтрации строк в ДФ будет
df %>% filter(group == 1 & wk == 1 & source == "A")

я написал рекурсивную функцию (get_rows), чтобы сделать это, но это, кажется, не делать то, что я хочу. Может ли кто-нибудь предоставить информацию о том, где я ошибаюсь?

library(dplyr) 

filter_row <- function(df,x) 
{ 
df %>% filter(group == x$group & wk == x$wk & source == x$source) 
} 

seg <- c("group", "wk", "source") 

get_rows <- function(df,seg,pos = 1, l = list()) 
{ 
    while(pos <= (length(seg) + 1)) 
    { 
     if(pos <= length(seg)) 
     for(j in 1:length(unique(df[,seg[pos]]))) 
     { 
      k <- unique(df[,seg[pos]]) 
      l[seg[pos]] <- k[j] 
      get_rows(df,seg,pos+1,l) 
      return() 
     } 
     if(pos > length(seg)) 
     { 
     tmp <- df %>% filter_row(l) 
     <call some function on tmp> 
     return() 
     } 
    } 
} 

get_rows(df,seg) 

EDIT: Я понимаю, что есть методы, которые я установка двоичные можно использовать, чтобы получить то, что мне нужно, но мне интересно, о том, где я буду неправильно в рекурсивной функции, которую я написал.

+1

Если вы хотите уникальные комбинации, попробуйте [это] (http://stackoverflow.com/questions/8363278/how-to-filter-for-unique- сочетание-оф-колонны-из-ан-т-dataframe). Если вам нужны операторы с уникальными подразделами, попробуйте [this] (http://www.magesblog.com/2012/01/say-it-in-r-with-by-apply-and-friends.html), в частности Таблица данных. – bwarren2

+0

Спасибо! Это очень полезно для этого контекста! Мне все еще интересно узнать, где я ошибаюсь в своей рекурсивной функции. –

+1

Что заставляет вас думать, что это рекурсивно? Цикл While? – Molx

ответ

1

Там может быть data.table/dplyr решение там, но этот один довольно прост.

# Just paste together the values of the column you want to aggregate over. 
# This creates a vector of factors 
f <- function(data, v) {apply(data[,v,drop=F], 1, paste, collapse = ".")} 

# Aggregate, tapply, ave, and a few more functions can do the same thing 
by(data = df,         # Your data here 
    INDICES = f(df, c("group", "wk", "source")), # Your data and columns here 
    FUN = identity, simplify = F)    # Your function here 

Можно также использовать library(dplyr) and library(data.table)

df %>% data.table %>% group_by(group, wk, source) %>% do(yourfunctionhere, use . for x) 
Смежные вопросы