2012-03-02 44 views
1

我有一個數據幀,其是樣品ID號碼,然後井位置的第一列,像這樣的獨特組合:將數據插入到數據幀中基於兩個因素

>df[1:12,1:10] 

S W V3 V4 
SID1 A01 <NA> <NA> 
SID2 A02 <NA> <NA> 
SID3 A03 <NA> <NA> 
SID4 A01 <NA> <NA> 
SID5 A02 <NA> <NA> 
SID5 A03 <NA> <NA> 

組合的S和W列是獨一無二的,並且必須保持如此,因爲一些樣品具有重複測量,但對於下游分析原因(不在R中)不能像通常那樣放置在同一行上。

我希望根據這兩列的唯一組合將數據插入數據框。

我想插入的數據是從另一個數據幀,看起來像這樣:

>results[1:12, 1:4] 

SampleID Value Assay   Well 
SID1  0  V3  A01 
SID1  0  V4  A01 
SID2  1  V3  A02 
SID2  2  V4  A02 
SID3  0  V3  A03 
SID3  1  V4  A03 
SID4  0  V3  A01 
SID4  0  V4  A01 
SID5  1  V3  A02 
SID5  2  V4  A02 
SID6  0  V3  A03 
SID6  1  V4  A03 

所以目前我通過列(V3和V4循環,也有真實的數據約1000列設置),並根據樣本ID,孔位置和化驗的獨特組合,逐個插入數據。這很慢。我想通過插入所有V3的值來加快矢量化速度,這取決於樣本ID和井號。

我試圖

for(i in levels(result$Assay)) 
{ 
    df$V3[(df$V1 %in% results$SampleID)&(df$V2 %in% results$Well] 
    = results$Value[results$Assay==i] 
} 

這對我不起作用。我想象因爲我的一些愚蠢!
任何想法?

編輯:
其實,本的解決方案几乎工作。一開始一切都很好,但是因爲測試分佈在n個文件上,並且當合並試圖通過測試將它加入到df中時將樣本分散在y文件中,它添加了一個新列並添加一個「.1」結束。

準確地說你期望合併做我想。我的錯是因爲沒有解釋我的數據來自不同的文件。

來說明:

我有16個文件。共有1536個樣本分佈在4個文件中,每個文件384個。有160個獨立的測定,分佈在4個測定包中。爲了運行每個樣品的每個分析,我最終得到16個文件。

所以如果我可以合併不添加一個新的列,如果當前化驗的列已經存在,那將是完美的。

歡迎您提出所有建議,
對於在解釋我的數據時發生垃圾而感到抱歉!

乾杯
戴維

+0

你說真實數據有1000列,但你說有160個獨立的分析。我認爲在最終結果中列=測定(160),行=樣品ID *孔(1536)? – 2012-03-03 01:50:41

回答

3

讓我們假設你有一個文件名在一個載體datafiles這樣的文件1-4樣品1-384的所有試驗數據,5-8樣品385所有檢測-768等等,並且您希望以1536行x 162列的數據框結束。

library(reshape) 
## read all files into a list of data frames: 
alldata <- lapply(datafiles,read.table) 

分成四個組塊:

splitdata <- split(alldata,rep(1:4,each=4)) 

的函數採取的n數據集的列表,每個都包含來自k個體(m測定即每一個都是k*m行乘4列:SampleIDWell,Assay,Value),並將它們組合成單個數據集,即kn*m+2列長:

mergefun <- function(X) { 
    cdata <- lapply(X, 
        cast, 
        formula=SampleID+Well~Assay, 
        value="Value") 
    ## produces data sets of the form 
    ## SampleID Well V3 V4 
    ## 1  SID1 A01 0 0 
    ## 2  SID2 A02 1 2 
    ## ... 
    Reduce(cdata,merge) 
} 

現在申請這對每個塊:

merged_data <- lapply(splitdata,mergefun) 

下面結合大塊:

final <- do.call(rbind,merged_data) 

我不知道這會工作,但它可能。如果第一次嘗試不起作用,你應該拆開它們,分別檢查他們做了什麼 - 我可能在某個地方搞砸了。

+0

謝謝!不敢相信我沒有想到這一點。 R讓我感到很蠢。 這大部分工作。儘管如此,仍然需要循環使用不同的Assay值。並且需要使用all.x = T來保存x中的行數。太感謝了。 – 2012-03-02 23:33:22

+0

嗨, 對不起1000列,以後會出現很多。我被混淆了(再一次,對不起這個垃圾!) 你的代碼幾乎完美工作。最後一行發生錯誤。我試圖試圖解決問題,但我認爲這需要一個新的問題。如果我不能克服它,我會把它放在可重現的問題上。再次感謝你的幫助。如果只有一個+ 1e6按鈕。傳說!!! – 2012-03-03 04:55:15

相關問題