如何将一组重叠范围划分为非重叠范围?但是在R

如何将一组重叠范围划分为非重叠范围?但是在R,r,merge,split,dataset,overlap,R,Merge,Split,Dataset,Overlap,假设我们有两个数据集: 化验: 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) 使用合并 本质上,all=T是完全外部联接的SQL等价物。我没有指定任何列,因为在本例中,merge函数将使用相同的名称跨列执行联接。很难,

假设我们有两个数据集:

化验:

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)
使用合并


本质上,all=T是完全外部联接的SQL等价物。我没有指定任何列,因为在本例中,merge函数将使用相同的名称跨列执行联接。

很难,但代码似乎可以工作。其思想是首先将每行扩展为多行,每行表示从到的一个增量。合并后,标识连续行并取消展开它们。。。显然,这不是一种非常有效的方法,因此,如果您的实际数据具有非常大的“从”和“到”范围,那么这种方法可能有效,也可能无效


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

您能解释一下输入和输出之间的关系吗?现在还不清楚。另外你试过什么?你能详细说明一下你的算法吗?@zero323,我想加入这两个sets@Michele,查看输出数据。这不是一个简单的合并。存在输入中不存在的值。另外,如果我计算正确,输入数据框中有9行,输出数据框中有10行。很抱歉,我不清楚,问题是要加入分析和岩性集。两者共享从到的相同列范围,并且这些范围在某些点上重叠。如何划分这些范围以生成非重叠范围的数据集,同时保留与其原始范围相关的信息?在这种情况下,相关信息是Cu和ROCK列
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  -
merge(assays, litho, all=T)
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