0

因此,在我的 df 中有一个列,其中包含我为实验测试的所有主题。条目被编码为具有 x 级别的因子。每个主题都经过了两次测试,因此 df 中的每个主题都有两个数据集。这些数据集可以有不同的长度。现在我需要按测试时间(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

例如,Subject DG 的前 2 个条目来自测试会话 1,第三行是会话 2,第 4 行是对象 BZ 的会话 1,第 5-7 行是会话 2 的 BZ,依此类推。

我的想法是添加另一个因子列(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

如果我正确阅读了您的数据,则每个唯一的 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 回答
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 回答
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 回答