0

したがって、私の df には、実験のためにテストしたすべての被験者を含む列があります。エントリは x レベルの因子としてコード化されます。各被験者は 2 回テストされているため、df には被験者ごとに 2 つのデータセットがあります。これらのデータ セットの長さは異なる場合があります。ここで、被験者をテストの時間 (1 または 2) でグループ化する必要があるため、モデルに固定効果として時間を含めることができます。どうやってやるの?

ここに私の小さな例dfがあります:

require("stringr")
>Subject<- c("DG_120204", "DG_120204", "DG_120305", "BZ_120407", "BZ_120506", "BZ_120506",     "BZ_120506", "SN_120310", "SN_120412")
s2<- str_extract(Subject, "\\d{6}")
dates<-as.Date(s2, format="%y%m%d") 
df<-data.frame(Subject, dates)


    Subject      dates
1 DG_120204 2012-02-04
2 DG_120204 2012-02-04
3 DG_120305 2012-03-05
4 BZ_120407 2012-04-07
5 BZ_120506 2012-05-06
6 BZ_120506 2012-05-06
7 BZ_120506 2012-05-06
8 SN_120310 2012-03-10
9 SN_120412 2012-04-12

たとえば、サブジェクト DG の最初の 2 つのエントリはテスト セッション 1 からのもので、3 行目はセッション 2、4 行目はサブジェクト BZ のセッション 1、5 ~ 7 行目は BZ のセッション 2 などです。

私の考えは、別の因子列 (df$time) を追加し、df$Subject のレベル (および df$dates の日付値?) に基づいて 1 と 2 で埋めることです。でも今はそこまでたどり着けません。

だから私はこのようなものを持っている必要があります:

    Subject      dates time
1 DG_120204 2012-02-04    1
2 DG_120204 2012-02-04    1
3 DG_120305 2012-03-05    2
4 BZ_120407 2012-04-07    1
5 BZ_120506 2012-05-06    2
6 BZ_120506 2012-05-06    2
7 BZ_120506 2012-05-06    2
8 SN_120310 2012-03-10    1
9 SN_120412 2012-04-12    2

これも非常に基本的な質問であることは承知していますが、ご容赦ください。私は最終的にこれを学びます...

4

3 に答える 3

2

件名の列を追加し (今のところ、明らかに最初の列の部分文字列にすぎません)、それが新しい日付 (1) かそうでないか (0) を示す列を追加してから、累積的にカウントします。日付が変わります。

df$id <- str_replace(df$Subject, "_.*", "") 
library(plyr)
df <- df[ order(df$Subject), ]
ddply(df, "id", mutate, 
  new  = c(1, dates[-1] != dates[-length(dates)]), 
  time = cumsum(new)
)

#     Subject      dates id new time
# 1 BZ_120407 2012-04-07 BZ   1    1
# 2 BZ_120506 2012-05-06 BZ   1    2
# 3 BZ_120506 2012-05-06 BZ   0    2
# 4 BZ_120506 2012-05-06 BZ   0    2
# 5 DG_120204 2012-02-04 DG   1    1
# 6 DG_120204 2012-02-04 DG   0    1
# 7 DG_120305 2012-03-05 DG   1    2
# 8 SN_120310 2012-03-10 SN   1    1
# 9 SN_120412 2012-04-12 SN   1    2
于 2012-06-20T14:57:43.117 に答える
2

私があなたのデータを正しく読んでいれば、それぞれの固有の 2 文字の識別子がサブジェクトであり、それぞれの固有の 6 桁の数字が差額トライアルですよね? もしそうなら、この質問は のために作られたものですcolsplit

> cbind(df, colsplit(df$Subject, '_', c('Subject_ID', 'Trial')))
    Subject      dates Subject_ID  Trial
1 DG_120204 2012-02-04         DG 120204
2 DG_120204 2012-02-04         DG 120204
3 DG_120305 2012-03-05         DG 120305
4 BZ_120407 2012-04-07         BZ 120407
5 BZ_120506 2012-05-06         BZ 120506
6 BZ_120506 2012-05-06         BZ 120506
7 BZ_120506 2012-05-06         BZ 120506
8 SN_120310 2012-03-10         SN 120310
9 SN_120412 2012-04-12         SN 120412
> 

これで、サブジェクト ID とトライアル番号を使用する準備が整いました。

于 2012-06-20T14:42:29.200 に答える
0

とループを組み合わせるとsplit()、次のようになります。for

require("stringr")
Subject<- c("DG_120204", "DG_120204", "DG_120305", "BZ_120407", "BZ_120506",
"BZ_120506", "BZ_120506", "SN_120310", "SN_120412")
s2 <- str_extract(Subject, "\\d{6}")
dates<-as.Date(s2, format="%y%m%d") 
df <- data.frame(Subject, dates)

# Add categorical variable:
spl <- split(df, f=df$Subject)
times <- 1:length(spl)
for(x in seq(along=times)) {
    spl[[x]]$time <- times[x]
}
df <- unsplit(spl, f=df$Subject)

# Sort based of 'Subject' column: 
df <- df[order(df$Subject),]
> df
    Subject      dates time
4 BZ_120407 2012-04-07   1
5 BZ_120506 2012-05-06   2
6 BZ_120506 2012-05-06   2
7 BZ_120506 2012-05-06   2
1 DG_120204 2012-02-04   3
2 DG_120204 2012-02-04   3
3 DG_120305 2012-03-05   4
8 SN_120310 2012-03-10   5
9 SN_120412 2012-04-12   6
于 2012-06-20T14:49:18.890 に答える