提取向量中元素高于给定阈值的所有子集
Extract all subsets in vector where elements are above a given threshold
我想知道是否有一种 R 方法(一个线性)来提取一个向量的所有子集的坐标,这些子集高于给定阈值。
假设我有以下数据:
v = c(3.48, 2.59, 1.73, 0.91, 0.13, -0.63, -1.34, -2.03, -2.67, -3.28, -3.04, -2.15, -1.20, -0.19, 0.84, 1.86, 2.84, 3.77, 4.60, 5.31, 4.16, 2.87, 1.89, 0.51, 0.23, 0.78, 1.34, 2.63, 1.72, 0.62, 0.98, 1.45)
假设我有 threshold = 0.7
。所需的输出将是:
left right
1 4
15 23
26 29
31 32
我原则上可以写一个 while
循环或某种形式,子集 v
并处理这些区域的 left
和 right
坐标,例如:
left = which(subset >= threshold)[1] + right
right = which(subset[left:length(subset)] < threshold)[1] - 1 # -1 to get the last element above the threshold
subset = v[(right + 1):length(v)]
(未测试),但我确定有一种 R 方式我似乎不记得了。
我看过 here 但这并不是我真正想要的。感谢任何帮助。
您可以使用 rle()
来查找超过阈值的运行值。当你可以把它变成你想要的格式时
rle(v>.7) |>
with(
data.frame(start=1, end=cumsum(lengths)) |>
transform(start=c(1, head(end, -1) + 1)) |>
subset(values)
)
还有那个returns
start end
1 1 4
3 15 23
5 26 29
7 31 32
这与 几乎相同,主要区别在于在布尔条件上使用 rle()
,然后仅子集化为 TRUE 值。
相同的解决方案,但使用 data.table
v = c(3.48, 2.59, 1.73, 0.91, 0.13, -0.63, -1.34, -2.03, -2.67, -3.28, -3.04, -2.15, -1.20, -0.19, 0.84, 1.86, 2.84, 3.77, 4.60, 5.31, 4.16, 2.87, 1.89, 0.51, 0.23, 0.78, 1.34, 2.63, 1.72, 0.62, 0.98, 1.45)
data.table(v)[, .(start = .I[1], end = .I[.N], keep = unique(v > 0.7)), by = rleid(v > 0.7)][keep == T, .(start, end)]
# start end
# 1: 1 4
# 2: 15 23
# 3: 26 29
# 4: 31 32
我想知道是否有一种 R 方法(一个线性)来提取一个向量的所有子集的坐标,这些子集高于给定阈值。 假设我有以下数据:
v = c(3.48, 2.59, 1.73, 0.91, 0.13, -0.63, -1.34, -2.03, -2.67, -3.28, -3.04, -2.15, -1.20, -0.19, 0.84, 1.86, 2.84, 3.77, 4.60, 5.31, 4.16, 2.87, 1.89, 0.51, 0.23, 0.78, 1.34, 2.63, 1.72, 0.62, 0.98, 1.45)
假设我有 threshold = 0.7
。所需的输出将是:
left right
1 4
15 23
26 29
31 32
我原则上可以写一个 while
循环或某种形式,子集 v
并处理这些区域的 left
和 right
坐标,例如:
left = which(subset >= threshold)[1] + right
right = which(subset[left:length(subset)] < threshold)[1] - 1 # -1 to get the last element above the threshold
subset = v[(right + 1):length(v)]
(未测试),但我确定有一种 R 方式我似乎不记得了。
我看过 here 但这并不是我真正想要的。感谢任何帮助。
您可以使用 rle()
来查找超过阈值的运行值。当你可以把它变成你想要的格式时
rle(v>.7) |>
with(
data.frame(start=1, end=cumsum(lengths)) |>
transform(start=c(1, head(end, -1) + 1)) |>
subset(values)
)
还有那个returns
start end
1 1 4
3 15 23
5 26 29
7 31 32
这与 rle()
,然后仅子集化为 TRUE 值。
相同的解决方案,但使用 data.table
v = c(3.48, 2.59, 1.73, 0.91, 0.13, -0.63, -1.34, -2.03, -2.67, -3.28, -3.04, -2.15, -1.20, -0.19, 0.84, 1.86, 2.84, 3.77, 4.60, 5.31, 4.16, 2.87, 1.89, 0.51, 0.23, 0.78, 1.34, 2.63, 1.72, 0.62, 0.98, 1.45)
data.table(v)[, .(start = .I[1], end = .I[.N], keep = unique(v > 0.7)), by = rleid(v > 0.7)][keep == T, .(start, end)]
# start end
# 1: 1 4
# 2: 15 23
# 3: 26 29
# 4: 31 32