2012-06-20 53 views
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 

例如,第2項爲主題DG從測試環節1,第三行是會議2,4號線是會議1主題BZ ,第5至第7行是BZ的第2次會話,以此類推。

我的想法是添加另一個因子列(df $ time),並根據df $ Subject(以及df $日期中的日期值)的級別填充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 

我知道這又是一個很基本的問題,請多多包涵!我將最終了解...

+0

也許我只是密集的,但我沒有看到日期和時間之間的聯繫?你怎麼知道哪些日期對應於時間== 1和時間== 2?如果你知道這一點,那麼看看'ifelse()'或者'transform()'來保持整潔。 – Chase

+0

@Chase:我只知道它,因爲較早的測試日期是會話1,而較晚的測試日期是會話2。但是,每個主題的日期不同。我會檢查你建議的功能... – kat

回答

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 
+0

謝謝,那正是我想要的! – kat

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和準備使用的試用版號。

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 
相關問題