根据存在大小为 n 的间隙的条件将列表拆分为子列表
Split a list into sub-lists based on condition that there is a gap of size n
我有一个自然增加的数字列表(即不断增加)。
alist <- c(1:20, 50:70, 210:235, 240:250)
一个数与下一个数的差是 n。
我想根据列表中每个项目之间的差异是否大于n的阈值来自动拆分列表。
例如,如果 n 的值 > 20,对于上面的特定列表,它应该将自己分成 3 个数据集。
调用 which(diff(alist) >20)
告诉我应该在哪里 "cut" 数据,但是对于我来说,我无法弄清楚下一步...我可能在这里遗漏了一些非常简单的东西。
理想情况下,结果应该成为列表的列表,或者 table(我也不介意):
[[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...
我们可以在逻辑 vector
上使用 cumsum
为 split
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)))
我有一个自然增加的数字列表(即不断增加)。
alist <- c(1:20, 50:70, 210:235, 240:250)
一个数与下一个数的差是 n。
我想根据列表中每个项目之间的差异是否大于n的阈值来自动拆分列表。
例如,如果 n 的值 > 20,对于上面的特定列表,它应该将自己分成 3 个数据集。
调用 which(diff(alist) >20)
告诉我应该在哪里 "cut" 数据,但是对于我来说,我无法弄清楚下一步...我可能在这里遗漏了一些非常简单的东西。
理想情况下,结果应该成为列表的列表,或者 table(我也不介意):
[[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...
我们可以在逻辑 vector
上使用 cumsum
为 split
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)))