根据存在大小为n的间隙的条件将列表拆分为子列表

时间:2017-07-18 09:37:28

标签: r list diff which

我有一个数字列表,其性质正在增加(即不断增加)。

alist <- c(1:20, 50:70, 210:235, 240:250)

从一个数字到下一个数字的差异是 n

我想根据列表中每个项目之间的差异是否大于 n 的阈值来自动拆分列表。

例如,如果 n 的值> 20,对于上面的特定列表,它应该分成3个数据集。

致电which(diff(alist) >20)告诉我应该在哪里&#34;切断&#34;数据上升,但对于我的生活,我无法弄清楚下一步......我可能会在这里错过一些非常简单的事情。

理想情况下,结果应该成为列表或表格(我也不介意):

[[1]]
 [1] 1 2 3 4 5 6 7 8 9 0 11 12 13 14 15 16 17 18 19 20

[[2]]
 [1] 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65...

[[3]]
 [1] 210 211 212 213...

1 个答案:

答案 0 :(得分:2)

我们可以在逻辑cumsum上使用vectorsplit ting

创建一个群组
unname(split(alist, cumsum(c(TRUE, diff(alist) > 20))))
#[[1]]
# [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

#[[2]]
# [1] 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70

#[[3]]
# [1] 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 240 241 242 243 244 245 246 247 248
# [36] 249 250

如果我们需要使用which方法,

i1 <- which(diff(alist) >20)
Map(function(i,j) alist[i:j], c(1, i1 +1), c(i1, length(alist)))