如何将一组重叠范围划分为非重叠范围?但是在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