【发布时间】:2018-11-28 19:40:45
【问题描述】:
我有一个大矩阵:
id v1 v2 v3 v4 v5 v6 v7 v8
1001 37 15 30 37 4 11 35 37
2111 44 31 44 30 24 39 44 18
3121 43 49 39 34 44 43 26 24
4532 45 31 26 33 12 47 37 15
5234 23 27 34 23 30 34 23 4
6345 9 46 39 34 8 43 26 24
对于每一行 (id),我想识别列 v1 到 v8 中的数字间隔。区间在这里定义为以相同数字开头和结尾的数字序列。
例如,在第一行中,有两个以 37 开头和结尾的序列:从第 1 列到第 4 列(37、15、30、37 ) 以及从第 4 列到第 8 列(37、4、11、35、37)。
焦点值应该只出现在开始和结束位置。例如,在第一行中,从 V1 的 37 到 V8 的 37 的序列不包括在内,因为 37 也出现在 V4 中。
对于每个间隔,我想要开始和结束列的索引、焦点开始和结束值,以及它们之间的数字序列。
期望的输出:
1001 [v1] to [v4] 37 to 37: 15,30
1001 [v4] to [v8] 37 to 37: 4, 11, 35
2111 [v1] to [v3] 44 to 44: 31
2111 [v3] to [v7] 44 to 44: 30, 24, 39
有什么建议吗?算法?
我设法为向量而不是矩阵的索引编写代码,
a <- which(x == 37)
from <- a[!(a-1) %in% a]
to <- a[!(a+1) %in% a]
rbind(from, to)
【问题讨论】:
-
试试
apply(mat, 1, function(x) tapply(x, cumsum(duplicated(x)|duplicated(x, fromLast = TRUE)), FUN = tail, -1)) -
@akrun;谢谢 有没有办法将大列表导出到 csv 文件中?