【发布时间】:2011-08-16 11:45:53
【问题描述】:
有没有办法在 R 中编码递增整数序列,类似于使用游程编码 (rle) 来编码游程长度?
我会用一个例子来说明:
类比:行程编码
r <- c(rep(1, 4), 2, 3, 4, rep(5, 5))
rle(r)
Run Length Encoding
lengths: int [1:5] 4 1 1 1 5
values : num [1:5] 1 2 3 4 5
要求:序列长度编码
s <- c(1:4, rep(5, 4), 6:9)
s
[1] 1 2 3 4 5 5 5 5 6 7 8 9
somefunction(s)
Sequence lengths
lengths: int [1:4] 5 1 1 5
value1 : num [1:4] 1 5 5 5
编辑 1
因此,somefunction(1:10) 将给出结果:
Sequence lengths
lengths: int [1:1] 10
value1 : num [1:1] 1
这个结果意味着有一个长度为10的整数序列,起始值为1,即seq(1, 10)
请注意,我的示例结果中没有错误。该向量实际上以 5:9 的序列结束,而不是用于构建它的 6:9。
我的用例是我正在处理 SPSS 导出文件中的调查数据。问题网格中的每个子问题都会有一个模式名称paste("q", 1:5),但有时会有一个“其他”类别标记为q_99、q_other 或其他内容。我希望找到一种识别序列的方法。
编辑 2
在某种程度上,我想要的函数是基函数 sequence 的逆函数,在我的示例中添加了起始值 value1。
lengths <- c(5, 1, 1, 5)
value1 <- c(1, 5, 5, 5)
s
[1] 1 2 3 4 5 5 5 5 6 7 8 9
sequence(lengths) + rep(value1-1, lengths)
[1] 1 2 3 4 5 5 5 5 6 7 8 9
编辑 3
我应该声明,就我的目的而言,序列被定义为递增整数序列,而不是单调递增序列,例如c(4,5,6,7) 但不是c(2,4,6,8) 也不是c(5,4,3,2,1)。但是,序列之间可以出现任何其他整数。
这意味着一个解决方案应该能够处理这个测试用例:
somefunction(c(2, 4, 1:4, 5, 5))
Sequence lengths
lengths: int [1:4] 1 1 5 1
value1 : num [1:4] 2 4 1 5
在理想情况下,该解决方案还可以处理最初建议的用例,其中包括向量中的字符,例如
somefunction(c(2, 4, 1:4, 5, "other"))
Sequence lengths
lengths: int [1:5] 1 1 5 1 1
value1 : num [1:5] 2 4 1 5 "other"
【问题讨论】:
-
Andrie,我仍然不清楚您的序列编码是如何工作的。这些值来自哪里,长度意味着什么? +1 用于举例说明,但您可以使其更清晰。
-
请定义:“序列”。 :) 我和 Ramnath 在一起——这不太合理。
-
@Ramnath 我希望编辑让它更清楚。在序列 1:10 中,长度为 10,value1 为 1。换句话说,您可以将这些参数传递给 seq.int 以重建原始向量。例如
seq.int(1, lenght.out=10) -
@Iterator。序列的定义与 R 中的
seq函数相同。因此,1:5 是从 1 到 5 的整数序列,即c(1,2,3,4,5) -
知道了。那么,这仅仅是决定何时在
rep和seq之间切换以重现给定向量的一种方式吗? (似乎rep的默认复制为 1?)如果是这样,那么这是一个有趣的编码问题。