我确信有一个超级简单的解决方案,我只是无法弄清楚它是什么。
我在R中有一个长的单变量数据集。我可以识别多个相关范围的开始和结束,我只需要过滤掉其余的。
所以给出了一个向量x:
> x <- c(2400:2600)
起点和终点的向量:
> startpoints <- c(1,11,101)
> endpoints <- c(3,13,103)
我需要返回看起来像这样的x子集:
> x[c(1:3, 11:13, 101:103)]
[1] 2400 2401 2402 2410 2411 2412 2500 2501 2502
我试过这个:
> x[startpoints:endpoints]
但是R只取每个向量的第一个值并返回该系列:
[1] 2400 2401 2402
......有几个警告
我的起点和终点矢量的长度应始终相等,尽管它们在长度上可能会因不同的数据集而变化。
答案 0 :(得分:5)
我们可以使用mapply
来获取“起始点”,“端点”的相应元素之间的序列,这可以对“x”向量进行子集化。
x[mapply(`:`, startpoints, endpoints)]
#[1] 2400 2401 2402 2410 2411 2412 2500 2501 2502
如果序列长度不同,如@nicola所述,mapply
会返回list
,所以我们需要unlist
x[unlist(mapply(`:`, startpoints, endpoints))]