查找某个值是否随后出现超过 n 次 [R]
Find if certain value appears more than n-times subsequently [R]
我有一个向量列表,例如:
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 )]
它returns vec1、vec2 和 vec3。
如何应用第二个条件?我可能会使用 rle() 但不知道如何使用。我将不胜感激。
我们可以使用 rle
与 Filter
中 OP 的第一个逻辑表达式 (1 %in% vec
) 短路来添加第二个条件,以过滤 list
的元素.
逻辑转换二进制值上的rle
根据lengths
(来自rle
)是否大于阈值'n'和它是一个 1 (TRUE
),用 any
包裹到 return 单个 TRUE/FALSE
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
我将向量压缩为一个字符串,并使用 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
)
]
我有一个向量列表,例如:
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 )]
它returns vec1、vec2 和 vec3。
如何应用第二个条件?我可能会使用 rle() 但不知道如何使用。我将不胜感激。
我们可以使用 rle
与 Filter
中 OP 的第一个逻辑表达式 (1 %in% vec
) 短路来添加第二个条件,以过滤 list
的元素.
逻辑转换二进制值上的rle
根据lengths
(来自rle
)是否大于阈值'n'和它是一个 1 (TRUE
),用 any
包裹到 return 单个 TRUE/FALSE
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
我将向量压缩为一个字符串,并使用 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
)
]