2013-10-19 170 views
-3

比方說,我們有兩個數據集:如何將一組重疊範圍劃分爲非重疊範圍?但R中

試驗:

BHID<-c(127,127,127,127,128) 
FROM<-c(950,959,960,961,955) 
TO<-c(958,960,961,966,969) 
Cu<-c(0.3,0.9,2.5,1.2,0.5) 
assays<-data.frame(BHID,FROM,TO,Cu) 

和光刻:

BHID<-c(125,127,127,127) 
FROM<-c(940,949,960,962) 
TO<-c(949,960,961,969) 
ROCK<-c(1,1,2,3) 
litho<-data.frame(BHID,FROM,TO,ROCK) 

,我想算法運行後加入兩組,結果將是:

BHID FROM TO CU ROCK 
125 940 970 - 1 
127 949 950 - 1 
127 950 958 0.3 1 
127 958 959 - 1 
127 959 960 0.9 1 
127 960 961 2.5 2 
127 961 962 1.2 - 
127 962 966 1.2 3 
127 966 969 - 3 
128 955 962 0.5 - 
+3

你能解釋一下輸入和輸出之間的關係嗎?目前尚不清楚。 – zero323

+0

另外你試過了什麼?你能詳細說明你的算法嗎? – agstudy

+0

@ zero323'我想加入這兩套' – Michele

回答

0

艱難的但代碼似乎工作。這個想法是首先將每一行擴展爲許多,每個代表從FROMTO的一個增量。合併後,確定連續的行並解開它們......顯然,它不是一種非常有效的方法,因此如果您的真實數據具有非常大的範圍,它可能會也可能不會。

library(plyr) 
ASSAYS <- adply(assays, 1, with, { 
    SEQ <- seq(FROM, TO) 
    data.frame(BHID, 
      FROM = head(seq(FROM, TO), -1), 
      TO = tail(seq(FROM, TO), -1), 
      Cu) 
}) 

LITHO <- adply(litho, 1, with, { 
    SEQ <- seq(FROM, TO) 
    data.frame(BHID, 
      FROM = head(seq(FROM, TO), -1), 
      TO = tail(seq(FROM, TO), -1), 
      ROCK) 
}) 

not.as.previous <- function(x) { 
    x1 <- head(x, -1) 
    x2 <- tail(x, -1) 
    c(TRUE, !is.na(x1) & !is.na(x2) & x1 != x2 | 
      is.na(x1) & !is.na(x2) | 
      !is.na(x1) & is.na(x2)) 
} 

MERGED <- merge(ASSAYS, LITHO, all = TRUE) 
MERGED <- transform(MERGED, 
    gp.id = cumsum(not.as.previous(BHID) | 
       not.as.previous(Cu) | 
       not.as.previous(ROCK))) 

merged <- ddply(MERGED, "gp.id", function(x) { 
    out <- head(x, 1) 
    out$TO <- tail(x$TO, 1) 
    out 
}) 

merged 
# BHID FROM TO Cu ROCK gp.id 
# 1 125 940 949 NA 1  1 
# 2 127 949 950 NA 1  2 
# 3 127 950 958 0.3 1  3 
# 4 127 958 959 NA 1  4 
# 5 127 959 960 0.9 1  5 
# 6 127 960 961 2.5 2  6 
# 7 127 961 962 1.2 NA  7 
# 8 127 962 966 1.2 3  8 
# 9 127 966 969 NA 3  9 
# 10 128 955 969 0.5 NA 10 

請注意,第一行與您的預期輸出不完全相同,但我認爲我的理解更有意義。

3

使用merge

merge(assays, litho, all=T) 

在本質上,all=TSQL等效FULL OUTER JOIN。我沒有指定任何列,因爲在這種情況下,merge函數將使用相同名稱在列之間執行聯接。