3

尋ねるのは非常に簡単な質問かもしれませんが、rでこの問題を解決するのに苦労しています. ID (参加者を識別するため)、タイプ (今回は 1 つの値)、決定 (A または B)、およびフィードバック (0 または 1) の 4 つの変数を含むデータセットがあります。2 人の参加者のデータ セットは次のようになります。

ID   Type    Decision    Feedback
1     1       A           0
1     1       A           0
1     1       B           1
1     1       B           1
1     1       B           0
2     1       A           0
2     1       A           1
2     1       A           1
2     1       A           0
2     1       B           1
etc...

以前のフィードバックの関数として、意思決定プロセスにおける変更の数を計算したいと考えています。つまり、参加者が A を選択し、否定的なフィードバックを受け取った場合、その参加者は再び A (滞在) または B (シフト) を選択します。したがって、私のコードは1人の参加者に対して次のとおりです。

Stay=0
Shift=0  

for(i in 2:length(mydf$Type)){  
    if(mydf$Decision[i] == "A" && mydf$Feedback[i-1]==1 && mydf$Decision [i-1] == "A" ){
    Stay= Stay+1
    }
    else if(mydf$Decision [i] == "B" && mydf$Feedback[i-1]==1 && mydf$Decision [i-1] == "B" ){
    Stay= Stay+1
    }
    else if(mydf$ Decision [i] == "A" && mydf$Feedback[i-1]==1 && mydf$Decision [i-1] == "B" ){
    Shift= Shift+1
    }
    else if(mydf$Decision [i] == "B" && mydf$Feedback[i-1]==1 && mydf$Decision [i-1] == "A" ){
    Shift= Shift+1
    }
}

しかし、私のデータ フレームには 20 人の参加者が含まれており、各参加者の滞在数とシフト数を取得するためにコードを拡張する方法がわかりません (つまり、最後に次のようなものを取得する)。

#ID    Stay    Shift
#1     10      10
#2     16      4
#etc...

よろしくお願いいたします。

4

3 に答える 3

3

これは、新しいデータ フレームに再結合する前に、列の 1 つに基づいてデータ フレームを分割し、それぞれについて何らかの分析を行うplyrddplyパッケージ (インストールする必要があります) を使用して行うのが最適です。

まず、num.stay.shiftデータ フレームの単一のサブセット (コメントで説明) を指定して、滞在とシフトの値を計算する関数を記述します。

num.stay.shift = function(d) {
    # vector of TRUE or FALSE for whether d$Feedback is 1
    negative.feedback = (head(d$Feedback, -1) == 1)
    # vector of TRUE or FALSE for whether there is a change at each point
    stay = head(d$Decision, -1) == tail(d$Decision, -1)
    # summarize as two values: the number that stayed when feedback == 1,
    # and the number that shifted when feedback == 1
    c(Stay=sum(stay[negative.feedback]), Shift=sum(!stay[negative.feedback]))
}

次に、ddplyデータ フレーム内の各個人にその関数を適用し、ID で分割します。

print(ddply(tab, "ID", num.stay.shift))

表示するデータ フレームのサブセットでは、最終的には次のようになります。

#   ID Stay Shift
# 1  1    2     0
# 2  2    2     0
于 2013-03-27T15:39:25.517 に答える
1

ID とフィードバックによる内訳はいかがですか。

  library(data.table)
  X <- data.table(mydf, key="ID")

  X[, list(Dif=abs(diff(as.numeric(Decision))),  
          FB=head(Feedback, -1))
        , by=ID][,list(Shifted=sum(Dif), Stayed=length(Dif)-sum(Dif)), by=list(ID,FB)]

  #     ID FB Shifted Stayed
  #  1:  1  0       1      1
  #  2:  1  1       0      2
  #  3:  2  0       1      1
  #  4:  2  1       0      2

または、 による内訳が必要ない場合Feedbackは、さらに簡潔になります。

X[ , {Dif=abs(diff(as.numeric(Decision))); 
     list(Shifted=sum(Dif), Stayed=length(Dif)-sum(Dif))}
  , by=list(ID)]

#      ID Shifted Stayed
# 1:  1       1      3
# 2:  2       1      3
于 2013-03-27T17:29:17.020 に答える
1

embed@DavidRobinsonの回答へのコメントに記載されているように、これは関数を使用した少し面倒な代替手段です。

d<-read.table(text="ID   Type    Decision    Feedback
1     1       A           0
1     1       A           0
1     1       B           1
1     1       B           1
1     1       B           0
2     1       A           0
2     1       A           1
2     1       A           1
2     1       A           0
2     1       B           1", header=TRUE)

do.call(rbind,
    by(d, d$ID, function(x) {
        f <- function(x) length(unique(x)) == 1
        stay <- apply(embed(as.vector(x$Decision), 2), 1, f)
        neg.feedback <- x$Feedback[1:nrow(x)-1] == 1
        c(Stay = sum(stay & neg.feedback), Shift = sum((! stay) & neg.feedback))
    })
)
#   Stay  Shift
# 1    2      0
# 2    2      0
于 2013-03-28T09:54:37.273 に答える