R 如何测试一系列的部分是否有间隙?
我在一个数据集中有几个(ice)岩芯剖面样本(R 如何测试一系列的部分是否有间隙?,r,R,我在一个数据集中有几个(ice)岩芯剖面样本(ID,在下面的示例中)。有些磁芯缺少部分(即间隙),但我不知道是哪些部分。如何使用R找到这个问题 例如: dt <- structure(list(ID = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), .Label = c("a", "b", "c"), class = "factor"), Sec.start = c(0, 5, 10, 20, 50, 100, 200
ID
,在下面的示例中)。有些磁芯缺少部分(即间隙),但我不知道是哪些部分。如何使用R找到这个问题
例如:
dt <- structure(list(ID = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L,
3L, 3L, 3L), .Label = c("a", "b", "c"), class = "factor"), Sec.start = c(0,
5, 10, 20, 50, 100, 200, 0, 5, 10, 30), Sec.end = c(5, 10, 20,
30, 100, 200, 400, 5, 10, 20, 50), Section = c("0-5", "5-10",
"10-20", "20-30", "50-100", "100-200", "200-400", "0-5", "5-10",
"10-20", "30-50")), .Names = c("ID", "Sec.start", "Sec.end",
"Section"), row.names = c(NA, -11L), class = "data.frame")
dt
ID Sec.start Sec.end Section
1 a 0 5 0-5
2 a 5 10 5-10
3 a 10 20 10-20
4 a 20 30 20-30
5 b 50 100 50-100
6 b 100 200 100-200
7 b 200 400 200-400
8 c 0 5 0-5
9 c 5 10 5-10
10 c 10 20 10-20
11 c 30 50 30-50
您可以尝试:
lapply(split(dt,dt$ID),function(x) all(x[-1,2]==x[-nrow(x),3]))
#$a
#[1] TRUE
#$b
#[1] TRUE
#$c
#[1] FALSE
以下是dplyr方法:
library(dplyr)
dt %>%
group_by(ID) %>%
summarise(check = all(Sec.end == lead(Sec.start, default = last(Sec.end))))
#Source: local data table [3 x 2]
#
# ID check
# (fctr) (lgl)
#1 a TRUE
#2 b TRUE
#3 c FALSE
或使用数据进行相同操作。表
:
library(data.table)
setDT(dt)[, .(check = all(Sec.end == shift(Sec.start, 1L, 'lead', fill = last(Sec.end)))),
by=ID]
# ID check
#1: a TRUE
#2: b TRUE
#3: c FALSE
这两种方法都使用滞后/超前函数(在名为
shift
的数据表中)将每一个Sec.end
值与下一行的Sec.start
值进行比较。在最后一行中,没有前导的秒开始
值,我们提供一个默认值,即最后一行的秒结束
——这意味着最后一行(每个ID)始终为真
。我们使用all
检查每个ID的所有比较是否TRUE
。Grande Nicola,一如既往;)Lol:),很高兴在很久之后见到你@SabDeM!两种解决方案(已接受的和此)都解决了问题。我接受了@nicola的解决方案,因为它不需要任何额外的包。谢谢你的回答!
library(data.table)
setDT(dt)[, .(check = all(Sec.end == shift(Sec.start, 1L, 'lead', fill = last(Sec.end)))),
by=ID]
# ID check
#1: a TRUE
#2: b TRUE
#3: c FALSE