在R中调用递归函数

时间:2015-06-25 16:58:44

标签: r recursion

假设我有一个数据框,df带有这个信息

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

我试图以编程方式过滤掉group,wk和source的唯一组合行,然后对它们执行一些操作,然后再将它们组合回另一个数据帧。我想编写一个可以扩展到任意数量的段(而不仅仅是这里的示例场景)并过滤行的函数。我需要传递的只是我想要分段的列名

例如。 seg <- c("group", "wk", "source")

用于过滤df中行的唯一组合是
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)
编辑:我知道我可以使用预先构建的方法来获得我需要的东西,但我很好奇我在我写的递归函数中出错了。

1 个答案:

答案 0 :(得分: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)