-3

假设我们有两个数据集:

化验:

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  -
4

2 回答 2

3

利用merge

merge(assays, litho, all=T)

本质上all=TSQL等价于FULL OUTER JOIN。我没有指定任何列,因为在这种情况下,merge函数将跨具有相同名称的列执行连接。

于 2013-10-19T22:47:48.667 回答
0

艰难的一个,但代码似乎工作。这个想法是首先将每一行扩展为多个,每个代表一个增量 from FROMto TO。合并后,识别连续的行并取消扩展它们......显然这不是一种非常有效的方法,因此如果您的真实数据具有非常大的范围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

请注意,第一行与您的预期输出并不完全相同,但我认为我的更有意义。

于 2013-10-20T01:45:36.033 回答