2017-04-20 8 views
2

正しい方向の回答またはポイントが評価されます。データサブセットにわたる可変長シーケンスの繰り返し回数をカウントする

- グループ(id)によって編成されたデータセットを持っています - データが対応する試行を示す列(試行)があります。この値は1から数まで繰り返されます。各試行値は、可変長(例えば、1122234444)で繰り返すことができる。 - グループ内で試行値による順序が繰り返されます。たとえば、各ID内では、一連の試行を経てから1で試行が再開され、何度か操作が繰り返されます。

IDの各グループ内でトライアルシーケンスが何回繰り返されたかを知る必要があります。

希望する出力は、変数 "繰り返し"です。

"repetition"変数は1から始まり、シーケンスが再び1に戻るまで繰り返す必要があります。試行シーケンスが2回目であることを示すために2に移動する必要があります。

試験、IDSの最大数、及び反復の数は常に変動しているが、試験配列は常に、1,2,3(可変長で繰り返す)進む....

id <- sort(rep(c("a", "b"), each = 4, times = 2)) 
trial <- rep(1:2, each = 2 , times = 2) 
repetition <- rep(1:2, each = 4, times = 2) 

df <- data.frame(id, trial, repetition) 

    id trial repetition 
1 a  1   1 
2 a  1   1 
3 a  2   1 
4 a  2   1 
5 a  1   2 
6 a  1   2 
7 a  2   2 
8 a  2   2 
9 b  1   1 
10 b  1   1 
11 b  2   1 
12 b  2   1 
13 b  1   2 
14 b  1   2 
15 b  2   2 
16 b  2   2 
+0

行1と同じように、別の列または別の繰り返しの計算が必要なようです.111は実際には前の1を繰り返さないため、0になる可能性があります。行1:a11繰り返し2回目は試行1の繰り返しです。ここでの試行は、線形実験チェーン内で何かが繰り返されていることを推測しなければなりません。同じ刺激を繰り返しながら、実際には異なる試行である。私は順番に試行し、3つの他の欄で刺激とそのようなことを説明します。 – Chris

答えて

1

私はあなたのデータは次のようになりますと仮定:

trial=rep(c(1,1,2,2,2,3,4,4,4,4,1,2,2,2,2,2,3,3,3,4,5,5,5,6,6,7,1,1,2,3,3,4,5,6,7,7,7),2) 
id=c(rep("a",length(trial/2)),rep("b",length(trial/2))) 
df=data.frame(id,trial,repetition=numeric(length(trial))) 

次に、このコードは、あなたが私の知る限り理解されるように求めているものを行います。

counter=1 
for(i in 1:nrow(df)){ 

    if(i>1){ 
    if(df$id[i-1] != df$id[i]){ 
     counter=1 
    } else { 

     if(df$trial[i-1]>df$trial[i]){ 
     counter=counter+1 
     } 

    } 
    df$repetition[i]=counter 
    }else{ 
    df$repetition[i]=1 
    } 
} 

私のデータフレームにrepetition - 列は既に存在しますが、 データフレームdfにまだrepetition列がない場合、これも機能します。 まだ存在しない場合は、ループ内のコードによって追加されます。

+0

これは素晴らしい作品です - ありがとう!以前は、行間の違いを調べてリセットをトリガーするのに似ていたが、構文のいくつかに苦労していた。私にそれを行う方法を教えてくれてありがとう。 – griffmer

1

ここではdplyrsplitstackshapeを組み合わせたアイデアがあります。最初にnew = cumsum(c(1, diff(trial) != 0))を使用して、異なるグループの数を取得します。その後、idnewでグループ化し、それらを数えます(new1)。我々はslice各グループの先頭を取得し、繰り返しを得るためにcumsum(trial == 1)を使用してください。最後に、我々はから得られたカウント数で行を複製する関数expandRowsを使用します。 selectungroupでちょっときちんと整理して終了します。

library(dplyr) 
library(splitstackshape) 

df %>% 
    mutate(new = cumsum(c(1, diff(trial) != 0))) %>% 
    group_by(id, new) %>% 
    mutate(new1 = n()) %>% 
    slice(1L) %>% 
    group_by(id) %>% 
    mutate(repetition = cumsum(trial == 1)) %>% 
    expandRows('new1') %>% 
    select(-new) %>% 
    ungroup() 
# A tibble: 16 × 3 
#  id trial repetition 
# <fctr> <int>  <int> 
#1  a  1   1 
#2  a  1   1 
#3  a  2   1 
#4  a  2   1 
#5  a  1   2 
#6  a  1   2 
#7  a  2   2 
#8  a  2   2 
#9  b  1   1 
#10  b  1   1 
#11  b  2   1 
#12  b  2   1 
#13  b  1   2 
#14  b  1   2 
#15  b  2   2 
#16  b  2   2 
+0

作品もありがとうございます!私はライブラリsplitstackshapeに慣れていませんでした。私にそれを示してくれてありがとう。メモとして、このソリューションは以前の回答よりも速くクロックを取るため、大規模なデータセットでは問題になります。 – griffmer

関連する問題