我有一個向量串列,例如:
vec1 <- c(rep(0,5), 1, rep(0,11), rep(1,4), rep(0,6))
vec2 <- c(rep(0,11), 1, rep(0,18))
vec3 <- c(rep(0,3), rep(1,5), rep(0,21))
vec4 <- c(rep(0,23))
test_list <- list(vec1, vec2, vec3, vec4)
我想根據 2 個條件過濾此串列:
- 1 存在于向量中。
- 1 連續(連續)出現 3 次以上。
我的輸出應該包含 vec1 和 vec3。
我寫了一個下面的函式:
filter_ones <- test_list[sapply(test_list,function(vec) 1 %in% vec )]
它回傳 vec1、vec2 和 vec3。
如何應用第二個條件?我可能會使用 rle() 但不知道該怎么做。我將不勝感激。
uj5u.com熱心網友回復:
我們可以使用rle短路與 OP 的第一個邏輯運算式 ( 1 %in% vec) in添加第二個條件Filter來過濾list.
根據(from ) 是否大于閾值 'n' 并且它是 1 ( ),將rle邏輯轉換后的二進制值轉換為第二個邏輯值,然后換行以回傳單個 TRUE/FALSElengthsrleTRUEany
n <- 3
Filter(function(x) 1 %in% x && any(with(rle(as.logical(x)),
lengths > n & values)), test_list)
-輸出
[[1]]
[1] 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0
[[2]]
[1] 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
或者使用 OP sapply
test_list[sapply(test_list,function(vec) 1 %in% vec &&
any(with(rle(as.logical(vec)),
lengths > n & values)))]
[[1]]
[1] 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0
[[2]]
[1] 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
uj5u.com熱心網友回復:
我將這些向量壓縮為一個字串,并使用 grepl 來獲取與這兩個條件都匹配的那些向量。
test_list[
# Get non-empty results
vapply(
# Find vectors where conditions apply
sapply(test_list, function(x) {
# condense vector to string and do grepl
# find those vectors where there is a 1 and a sequence of at least 3 1s and vice versa
if(grepl("1.*111|111.*1", paste(x, collapse = ""))) x
# Get non-empty results
}), Negate(is.null), NA
)
]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/368699.html
上一篇:使用矩形勾勒地圖區域
