在R中将数字向量分割

3

如果我有一个向量c(1,2,3,5,7,9,10,12)……和另一个向量c(3,7,10),我应该如何产生以下结果:

[[1]]
1,2,3

[[2]]
5,7

[[3]]
9,10

[[4]]
12

注意到每个列表元素的最后一个数字(除了最后一个)是3、7和10。或者可以说是“断点”。我相信有一个简单的R函数,但我可能不知道或者遗忘了。

3个回答

3

使用cutsplit的方式如下:

split(x, cut(x, c(-Inf, y, Inf)))
#$`(-Inf,3]`
#[1] 1 2 3
#
#$`(3,7]`
#[1] 5 7
#
#$`(7,10]`
#[1]  9 10
#
#$`(10, Inf]`
#[1] 12

你们两个给出了几乎相同的答案。虽然@beginneR通过使用-Inf到Inf作为边界而不是第一个和最后一个元素来将其推广到未排序的向量。 - user41912
我只是在评论,我们的答案不同得足以让两个都留下来。 - talat
但令人惊讶的是,今天我没有学习到任何酷炫的新R函数。只是将split和cut巧妙地结合在一起使用而已。 :) - user41912
@user41912,你可以创建自己的酷炫新R函数 superCoool <- function(x , y) split(x, cut(x, c(-Inf, y, Inf))) :) - talat
初学者天才!无论如何都是很好的答案 :) 答案被接受了。 - user41912
无论如何,我已经进行了编辑,使其适用于未排序的向量,但是没有使用“inf”和“-inf”,因此我认为它比你的更好 :) - David Arenburg

1

能够实现

split(x, cut(x, unique(c(y, range(x)))))

## $`[1,3]`
## [1] 1 2 3

## $`(3,7]`
## [1] 5 7

## $`(7,10]`
## [1]  9 10

## $`(10,12]`
## [1] 12

0
与 @beginneR 的答案类似,但是使用 findInterval 代替 cut
split(x, findInterval(x, y + 1))
# $`0`
# [1] 1 2 3
# 
# $`1`
# [1] 5 7
# 
# $`2`
# [1]  9 10
# 
# $`3`
# [1] 12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接