1

私のデータセットには約 54,000 行あります。別の列の値と、その他の列の値が以前に見られたかどうかに応じて、値 (First_Pass) を T または F に設定したいと考えています。必要なことを正確に実行する for ループがあります。ただし、そのループはデータのサブセットのみを対象としています。因子レベルに基づいて、異なるサブセットに対して個別に同じ for ループを実行する必要があります。

データをサブセットに分割し、関数 (my for ループ) を適用してからデータを再結合したいので、これは plyr 関数の完璧なケースのようです。しかし、私はそれを機能させることができません。まず、char.data と呼ばれる df のサンプルを示します。

     session_id list Sent_Order Sentence_ID Cond1 Cond2 Q_ID   Was_y CI CI_Delta character tsle tsoc Direct
5139          2    b          9          25    rc    su   25 correct  1        0         T  995   56      R
5140          2    b          9          25    rc    su   25 correct  2        1         h   56   56      R
5141          2    b          9          25    rc    su   25 correct  3        1         e   56   56      R
5142          2    b          9          25    rc    su   25 correct  4        1             56   37      R

そこにはいくつかの混乱があります。キー列は、session_id、Sentence_ID、CI、および CI_Delta です。

次に、First_Pass という列を "F" に初期化します。

char.data$First_Pass <- "F"

ここで、session_id と Sentence_ID の組み合わせごとに First_Pass が実際に「T」になるタイミングを計算したいと思います。おもちゃのセットを作成しました。これは、全体的なロジックを解決するための 1 つのサブセットにすぎません。これは、おもちゃのデータに必要なものだけを提供する for ループのコードです。

char.data.toy$First_Pass <- "F"
l <-c(200)
for (i in 1:nrow(char.data.toy)) {
  if(char.data.toy[i,]$CI_Delta >= 0 & char.data.toy[i,]$CI %nin% l){
    char.data.toy[i,]$First_Pass <- "T"
    l <- c(l,char.data.toy[i,]$CI)}
}

このループを取得して、すべての session_id および Sentence_ID サブセットに対して実行したいと思います。set_fp という関数を作成し、それを ddply 内で呼び出しました。そのコードは次のとおりです。

#define function
set_fp <- function (df){

  l <- 200
  for (i in 1:nrow(df)) {
    if(df[i,]$CI_Delta >= 0 & df[i,]$CI %nin% l){
      df[i,]$First_Pass <- "T"
      l <- c(l,df[i,]$CI)}
    else df[i,]$First_Pass <- "F"
    return(df)
  }

}

char.data.fp <- ddply(char.data,c("session_id","Sentence_ID"),function(df)set_fp(df))

残念ながら、これは正しくありません。長い間、First_Pass のすべての "F" 値を取得していました。今、私は 24 個の T 値を取得していますが、もっと多くあるはずなので、最後のサブセットまたは類似のものだけを保持していると思われます。ヘルプ?

4

1 に答える 1