像
这样的数字列表a
1
2
3
6
7
8
9
10
11
12
15
16
19
20
21
22
23
24
25
提取3个连续值而不重复。 结果应该像
就像每隔3行连续排列一样,但我们可以看到7,8,9也是连续的,但忽略了删除重复
a b c
1 2 3
6 7 8
9 10 11
19 20 21
22 23 24
提前致谢
答案 0 :(得分:1)
有点不整洁,但做的工作是:
d <- data.frame(a=a[-(1:2)], diff=diff(a, 2))
d$br <- 0
for (i in 1:nrow(d)) {
if (i==1 & d$diff[1]==2) {
d$br[1] <- 1
} else if (i==2 & d$diff[2]==2 & d$br[1]!=1) {
d$br[2] <- 1
}
if (d$diff[i]==2 & !any(sum(d$br[c(i-1, i-2)])>0)) d$br[i] <- 1
}
t(sapply(d$a[d$br==1], function(x) (x-2):x))
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 6 7 8
# [3,] 9 10 11
# [4,] 19 20 21
# [5,] 22 23 24
将所有内容包装到函数中,并使用其他序列进行测试:
getConsec <- function(a) {
d <- data.frame(a=a[-(1:2)], diff=diff(a, 2))
d$br <- 0
for (i in 1:nrow(d)) {
if (i==1 & d$diff[1]==2) {
d$br[1] <- 1
} else if (i==2 & d$diff[2]==2 & d$br[1]!=1) {
d$br[2] <- 1
}
if (d$diff[i]==2 & !any(sum(d$br[c(i-1, i-2)])>0)) d$br[i] <- 1
}
t(sapply(d$a[d$br==1], function(x) (x-2):x))
}
a <- sort(sample(1:30, 20))
# [1] 1 2 3 4 6 10 12 14 15 16 17 18 19 20 21 23 25 27 28 30
getConsec(a)
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 14 15 16
# [3,] 17 18 19
答案 1 :(得分:0)
如果我理解正确,这应该可以完成工作
matrix(unique(a),ncol=3, byrow=T)
它将忽略重复值,然后逐行填充3列矩阵