簡體   English   中英

如何從R中的數字列表創建多個范圍?

[英]How to create multiple range from a list of numbers in R?

如果我有一個數字列表:

> list1
 [1]   58659   59837 2603675 2607619 2607631 2608098 2608106 2608975 2608978 2609613
 [11] 2609635 2610225 2610235 2610408 2610453 2610782 2610799 2611212 2611232 2611642
 [21] 2611646 2611825 2611828 2612151 2612154 2612741 2612943 2614220 2614222 2614941
 [31] 2615008 2616276 2616304 2617656

是否有一個函數可根據我提供的閾值(例如100000 )創建兩個列表,並得出

[1] 58659 59837 2603675 2617656

另一個簡單的例子

>list2
[1] 1 2 3 4 11 12 13 14

閾值為2,它將給出

[1] 1 4 11 14

您可以使用以下技巧找到這些范圍(其中list2是向量,閾值2閾值):

tapply(list2, cumsum(c(TRUE, diff(list2) > 2)), range)

看起來很神秘,但這是一個演練。 您可以從有用的diff函數開始查找連續的差異:

list2 = c(1, 2, 3, 4, 11, 12, 13, 14)
diff(list2)
# 1 1 1 7 1 1 1

然后,如果您檢查哪些項目大於閾值,則會發現中斷(新組的開始)在哪里:

diff(list2) > 2
# [1] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE

請注意,它比原始列表短一(因為連續差異的數量為n-1)。 要解決此問題,請將TRUE附加到開始位置(因為第一個元素始終是新組的開始位置):

c(TRUE, diff(list2) > 2)
# [1] TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE

但這只是告訴您中斷在哪里,而不是每個元素所在的組。 但是累積總和會告訴您(因為總和會將TRUE視為1,將FALSE視為0):

cumsum(c(TRUE, diff(list2) > 2))
# [1] 1 1 1 1 2 2 2 2

現在我們到了某個地方! tapply是一個有用的函數,它基於另一個向量定義的組將函數應用於向量,例如這里的1和2組。 我們想應用range函數來學習每個組中的范圍(最小和最大):

result = tapply(list2, cumsum(c(TRUE, diff(list2) > 2)), range)
result[[1]]
# 1 4
result[[2]]
# 11 14

請注意,這是一個列表,在我看來,它比諸如1 4 11 14的串聯向量更有用。 但是,以防萬一您確實希望采用這種格式,可以執行以下操作:

do.call(c, result)

將其組合成一個向量。

我認為您想使用diff找出每個連續值之間的空間,然后將值提取到該空間的左側和右側。 這是一個示例函數:

f<-function(x,thresh){
  pos<-which(diff(x)>thresh)
  x[unique(c(1,pos,pos+1,length(x)))]
}

x<-unname(unlist(read.table(textConnection('58659   59837 2603675 2607619 2607631 2608098 2608106 2608975 2608978 2609613 2609635 2610225 2610235 2610408 2610453 2610782 2610799 2611212 2611232 2611642 2611646 2611825 2611828 2612151 2612154 2612741 2612943 2614220 2614222 2614941 2615008 2616276 2616304 2617656'))))
f(x,10000)
# [1]   58659   59837 2603675 2617656
x<-c(1:4,11:14)
f(x,2)
# [1]  1  4 11 14

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM