2012-06-28 104 views
0

多個條件,我有兩個dataframes:合併對R中

df1 <- data.frame(pt = c("pt1153", "pt1153", "pt1153", "pt1154", "pt1155", "pt1156"), 
        phys = c("p10", "p616", "p850", "p899", "p709", "p892")) 

df2<- data.frame(sender = c("p10", "p10", "p100", "p100", "p102", "p103"), 
        s.type = c(11,11,21,21,11, 21), 
        receiver = c("p616", "p850", "p235", "p388", "p596", "p696"), 
        r.type = c(21,31,11,11,31,31), 
        shared.pts = c(1,1,1,1,1,1)) 

我想

sender s.type receiver r.type shared.pts pts 
    p10 11 p616  21  1  p1153 
    p10 11 p850  31  1  p1153 

結束了,但我無法弄清楚如何做到這一點。我嘗試合併,然後使用ddply,但沒有奏效。我也嘗試過應用程序,但無法弄清楚要做什麼功能。

合併dfs是不夠的。我有必要根據DF1

每個共享列「PTS」的成員合併它們雖然我似乎無法重現我的問題,當我使用合併我結束了:

 p.sender.id p.receiver.type Source.total.pts p.receiver.id p.sender.type Target.total.pts shared.pts patient.id 
1   p10    21    6   p616   11    3   1  pt2439 

2   p10    21    6   p616   11    3   1  pt1870 

3   p10    21    6   p616   11    3   1  pt1153 

4   p10    21    6   p616   11    3   1  pt64 
5   p10    21    6   p616   11    3   1  pt1626 
6   p10    21    6   p616   11    3   1  pt941 
7   p10    31    6   p850   11    10   1  pt2439 
8   p10    31    6   p850   11    10   1  pt1870 
9   p10    31    6   p850   11    10   1  pt1153 
10   p10    31    6   p850   11    10   1  pt64 

當p10和p616只共享一個pt時。 pt1153

回答

1

這讓你最那裏的方式,僅列不在相同的順序:

ddply(df1,.(pts),function(x){ x$p }) 
    pts V1 V2 
1 pt11 p55 p90 
2 pt800 p10 p850 

但因爲我只用df1我懷疑你是否已經離開了什麼你的問題意味着你不能在你的真實數據中使用這個策略。

+0

我得到這個錯誤,當我試試這個方法:'錯誤list_to_dataframe(RES,ATTR(。數據, 「split_labels」)):結果不具有相等lengths' – crock1255

+0

@ crock1255我不打算花時間回答一個問題,然後回答。 – joran

+0

我沒有意識到我的例子不會重現我得到的同樣的錯誤。我試圖用數據輸入保存一些步驟。如果我對這個問題沒有遺漏,我不會問董事會。我很欣賞時間,但如果我意識到答案不會回答我最初想要回答的問題,就不會重做這個例子。 – crock1255

2

我認爲合併應該工作!

merge(df2, df1, by.x = "sender", by.y = "p") 
    sender receiver pts 
1 p10  p850 pt800 
2 p55  p90 pt11 
+0

我應該在我的示例中加入更多示例。這隻適用於p10 - > p850只有一個實例。如果我有p10,p10,p10,p850,p800 p75,我會爲p10的每個實例獲得一個pt800,這正是我想要避免的。我要解決這個例子 – crock1255