2014-09-02 52 views
0

我想sample_id1sample_id2valueFile1.txtcount.txt配合sampleIDvalueID和乘以op1op2計數。我不知道如何在for循環中執行此操作並定義兩個新列。匹配ID,併產生新的列

File1.txt 
sample_id1 sample_id2 op1 op2 value 
    IX12  IX78  2  3 15 
    IX12  IX81  4  0 15 
    IX78  IX81  66 43 35 
    IX12  IX78  23 10 35 
    IX12  IX81  43 0 55 
    IX12  IX78  43 0 55 

File2.txt 
sampleID valueID count  
    IX12  15 900 
    IX12  35 2000 
    IX12  55 3500 
    IX78  15 865 
    IX78  35 1500 
    IX78  35 2400 
    IX81  15 234 
    IX81  35 906 
    IX81  55 2001 


output.txt 
sample_id1 sample_id2 op1 op2 value new_col_op1 new_col_op2 
    IX12  IX78  2  3 15  1800  2595 
    IX12  IX81  4  0 15  3600   0 
    IX78  IX81  66 43 35  99000  38958  
    ........ 

output.txt我乘以op1op2從第一行900和865和生成new_col_op1new_col_op2

感謝。

+0

當你說「比賽」,你是什麼意思特別?內部連接,左連接等...?例如,你是否試圖將'sample_id1'的每個值與'sampleID'的每個值匹配,然後爲'sample_id2'和'sampleID'做樣本? – nrussell 2014-09-02 14:10:24

+0

是的我試圖將sample_id1和value的每個值與sampleID和valueID匹配,然後在op1上執行操作。同樣的方法適用於sample_id2 – hash 2014-09-02 14:15:04

+0

@hash不知道你是如何得到'2565'的第一行 – akrun 2014-09-02 14:29:02

回答

1

我不知道這是否是你想要的東西:(df1df2是數據集)

df11 <- transform(merge(df1[,-2], df2, by.x=c("sample_id1", "value"), by.y=c("sampleID", "valueID")), new_col_op1=op1*count) 
df12 <- transform(merge(df1[,-1], df2, by.x=c("sample_id2", "value"), by.y=c("sampleID", "valueID")), new_col_op2=op2*count) 

res <- merge(df11, df12, by=c("value", "op1", "op2"),sort=FALSE) 
    head(res,4) 
# value op1 op2 sample_id1 count.x new_col_op1 sample_id2 count.y new_col_op2 
#1 15 2 3  IX12  900  1800  IX78  865  2595 
#2 15 4 0  IX12  900  3600  IX81  234   0 
#3 35 23 10  IX12 2000  46000  IX78 1500  15000 
#4 35 23 10  IX12 2000  46000  IX78 2400  24000 

或者使用dplyr

library(dplyr) 
df11 <- inner_join(df1[,-2],setNames(df2, c("sample_id1", "value", "count"))) %>% mutate(new_col_op1=op1*count) 
df12 <- inner_join(df1[,-1],setNames(df2, c("sample_id2", "value", "count"))) %>% mutate(new_col_op2=op2*count) 
res1 <- inner_join(df11, df12, by=c("op1", "op2", "value")) 

    head(res1,4) 
    # sample_id1 op1 op2 value count.x new_col_op1 sample_id2 count.y new_col_op2 
    #1  IX12 2 3 15  900  1800  IX78  865  2595 
    #2  IX12 4 0 15  900  3600  IX81  234   0 
    #3  IX12 23 10 35 2000  46000  IX78 1500  15000 
    #4  IX12 23 10 35 2000  46000  IX78 2400  24000 
+0

合併與DF12 DF11給了我下面的問題,因爲我有一個巨大的FILE1.TXT ***抓到段錯誤*** 地址0x2aacbf0f2000,因「內存未映射」 回溯: 1:merge.data.frame(DF11, DF12,通過= C( 「百分比」),排序= FALSE) 2:合併(DF11,DF12,通過= C( 「值」),排序= FALSE) 可能的動作: 1:中止(帶核心轉儲,如果啓用) 2:普通R退出 3:退出R而不保存工作區 4:退出R保存工作區 – hash 2014-09-02 15:50:54

+0

@hash不清楚「巨大」是您的文件的大小。你可以嘗試'dplyr'或'data.table',但是如果文件非常大,你可能需要一些數據庫。我將用'dplyr'解決方案進行更新。 – akrun 2014-09-02 16:34:03

相關問題