2013-02-20 31 views
0

鈣 數據< - 切(數據$時間,休息= SEQ(0,最大值(數據$時間)+400,400)) 通過(數據$催產素,割傷,平均)如何在R編程中處理多組數據?

但這隻能爲一個人的數據工作......但我有十個人有自己的時間和催產素數據......我怎樣才能同時得到他們的平均數?而不是有這種類型的輸出:

cuts: (0,400] 
[1] 0.7 
------------------------------------------------------------ 
cuts: (400,800] 
[1] 0.805 

有沒有辦法我可以得到這些削減名單?

+0

你能提供一個你的數據結構的例子嗎?你如何將它存儲在R中?知道這一點,我想我可以幫助一個簡單的解決方案。 – 2013-02-20 21:42:57

+0

我剛剛使用.... data = read.delim(「剪貼板」)...數據來自excel電子表格 – 2013-02-21 03:07:54

+0

好吧,我明白了。我需要一個精確的數據結構。你可以運行dump(head(data,10),「」)'並在這裏粘貼輸出嗎?是否有可能分享一些數據?這會有很大的幫助。如果存在保密問題,也許你可以先用隨機值乘以數字。 – 2013-02-21 03:39:37

回答

1

下面是使用IRanges包的解決方案。

idx假設你的數據格式是TimedataTimedata,...等等。所以,它會創建索引1,3,5,...ncol(df)-1

ir1是你想要的意思的時間間隔。它的寬度是400.對於每個時間列(這裏是第1列和第3列),它從0到最大值(時間)。

ir2是間隔寬度的相應時間列= 1

然後我得到的ir1的重疊與ir2,基本上告訴我其中的間隔從IR2與IR1重疊(我們想要的),從中我計算平均值並輸出data.frame

idx <- seq(1, ncol(df), by=2) 
o <- lapply(idx, function(i) { 
    ir1 <- IRanges(start=seq(0, max(df[[i]]), by=401), width=401) 
    ir2 <- IRanges(start=df[[i]], width=1) 
    t <- findOverlaps(ir1, ir2) 
    d <- data.frame(mean=tapply(df[[i+1]], queryHits(t), mean)) 
    cbind(as.data.frame(ir1), d) 
}) 

> o 
# [[1]] 
# start end width  mean 
# 1  0 400 401 0.6750000 
# 2 401 801 401 0.8050000 
# 3 802 1202 401 0.8750000 
# 4 1203 1603 401 0.2285333 

# [[2]] 
# start end width mean 
# 1  0 400 401 0.73508 
# 2 401 801 401 0.13408 
# 3 802 1202 401 0.26408 
# 4 1203 1603 401 1.06408 
# 5 1604 2004 401 3.06408 

對於每個Time欄,你會得到與間隔列表,並意味着該時間間隔。

+0

感謝您的答案阿倫,但我得到這樣的錯誤:as.data.frame(ir1)中的錯誤:找不到對象'ir1' – 2013-02-21 05:48:58

+0

對於這些數據或另一個您的數據? – Arun 2013-02-21 06:55:31

+0

你有'IRanges'軟件包安裝和加載使用庫(IRanges)'? – Arun 2013-02-21 07:01:15