2016-02-19 23 views
4

我在數據集中有幾個(冰)核心部分樣本(下例中爲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 

「a」 和 「b」 的不具有間隙,而 「C」 不(缺失20和30之間片),所以我是下面的結果後:

$a 
[1] TRUE 

$b 
[1] TRUE 

$c 
[1] FALSE 

回答

4

你可以試試:

lapply(split(dt,dt$ID),function(x) all(x[-1,2]==x[-nrow(x),3])) 
#$a 
#[1] TRUE 
#$b 
#[1] TRUE 
#$c 
#[1] FALSE 
+1

Grande Nicola,一如既往;) – SabDeM

+1

大聲笑:),很高興見到你很久以後@SabDeM! – nicola

4

這裏有一個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 

或者使用data.table相同:

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 

這兩種方法都利用滯後/超前功能(在data.table稱爲shift)來比較每個Sec.end值到下一行的Sec.start值。在最後一行,沒有前導的Sec.start值,我們提供默認值,這是最後一行的Sec.end - 這意味着最後一行(每個ID)總是TRUE。我們使用all來檢查是否所有的比較是每個ID TRUE

+0

這兩個解決方案(被接受和這個)解決了這個問題。我接受@ nicola的解決方案,因爲它不需要任何額外的軟件包。謝謝你的回答! – Mikko

+0

@Mikko,thx反饋!我也喜歡尼科拉的回答 –