3

私はいくつかのpurrrイディオムを試しています-特に、ループする(または必要に応じて適用する)関数は、1つのdata.frameを介して機能し、別のdata.frameの他のすべての行と比較します...そしてその比較関数に基づいてデカルト積をフィルタリングします..

> df1    
        chr start   end
      (fctr) (int) (int)
    1   chr1  9069  9176
    2   chr1 10460 11368
    3   chr1 34633 35625
    4   chr1 36791 37023
> df2
     chr start2
  (fctr) (dbl)
1   chr1  9169
2   chr1 10360
3   chr1 34633

したがって、簡単な関数の例は次のとおりです。

> is.between <- function(x1, y1, y2){
  ifelse(x1 >= y1 & x1 <= y2, TRUE, FALSE)
}

私が(今のところ)探している結果は、次のdf3ような2 x 4 の data.frame である必要があります

             # desired result
             chr start  end  start2
          (fctr) (int) (int)
        1   chr1  9069  9176  9169
        2   chr1  34633 35625 34633

素朴に、私はそのように関数を使用しようとしましpurrr::cross_nた...

> cross_n(list(df2$start2, df1$start, df1$start), .filter = is.between)

もちろん、それは機能しません。3 つの入力列 (48 の組み合わせ) のデカルト積を検索しています。df2$start2vs [df1$startdf1$end]の組み合わせ (12 通り) を検索したいと考えています。

それで...purrrフレームワーク内でこれを行う方法はありますか?

cross_norcross2と errr で完全に取得できません..のドキュメントを完全には理解していませんcross_d

4

1 に答える 1

1

OK FWIW - 私はpurrr::cross_n自分の質問に答えるためにいくつかの機能を適応させました。新しい関数cross2dは次のようになります。

# this makes sense only if the .l in the same groups are the same length
# ie they are probably from the same data.frame
cross2d<- function(.l, groups = NULL, .filter = NULL){
  if (is_empty(.l) | is.null(groups)) {
    return(.l)
  }
  if (!is.null(.filter)) {
    .filter <- as_function(.filter)
  }

  n <- length(.l)

  #separate df for each group
  df1<- data.frame(.l[groups==0])
  df2<- data.frame(.l[groups==1])


  exp.coords<-expand.grid(1:nrow(df1), 1:nrow(df2))
  df<- data.frame(df1[exp.coords$Var1,], df2[exp.coords$Var2,])
  names(df)<-c(colnames(df1),colnames(df2))

  df[do.call(.filter, unname(df)),]
}

上記の例のデータdf1と関数df2では、次のis.betweenように使用します。

> cross2d(list(x1=df2$start, x2=df1$start, y2=df1$end), group=c(0,1,1), .filter=is.between)
       x1    x2    y2
1    9169  9069  9176
3.2 34633 34633 35625

これを2つのグループ(実際にはdata.frames)とdata.frame出力用にコーディングしました..しかし、さらに一般化することは可能かもしれません...?

于 2016-02-23T12:38:51.483 に答える