我正在开展一个项目,我需要在R中输入一些“T得分”表。这些表用于将原始测试分数转换为标准值。它们通常遵循特定的模式,但不是简单的模式。例如,一种模式是:
34,36,39,42,44,47,50,52,55,58,60,63,66,68,
71,74,76,79,82,84,87,90,92,95,98,100,103,106
我更喜欢用一个简单的函数来填充它们,而不是手工输入。我知道seq()函数可以创建一个简单的seqeuence,如:
R> seq(1,10,2)
[1] 1 3 5 7 9
有没有办法根据特定模式创建更复杂的序列?例如,上述数据可以完成:
c(34,seq(36:106,c(3,3,2)) # The pattern goes 36,39,42,44,47,50,52 (+3,+3,+2)
...但是,这会导致错误。我以为会有一个功能应该这样做,但是我所有的Google-fu刚刚把我带回原来的seq()。
答案 0 :(得分:10)
可以使用cumsum
(累积总和)函数和rep
完成此操作:
> 31 + cumsum(rep(c(3, 2, 3), 9))
[1] 34 36 39 42 44 47 50 52 55 58 60 63 66 68 71 74 76 79 82
[20] 84 87 90 92 95 98 100 103
确保序列在正确的位置停止:
> (31 + cumsum(rep(c(3, 2, 3), 10)))[1:28]
[1] 34 36 39 42 44 47 50 52 55 58 60 63 66 68 71 74 76 79 82
[20] 84 87 90 92 95 98 100 103 106
答案 1 :(得分:9)
这是一个自定义功能,在大多数情况下应该可以使用。它使用序列的累积和(cumsum()
)和整数除法来计算所需序列的长度。
cseq <- function(from, to, by){
times <- (to-from) %/% sum(by)
x <- cumsum(c(from, rep(by, times+1)))
x[x<=to]
}
试一试:
> cseq(36, 106, c(3,3,2))
[1] 36 39 42 44 47 50 52 55 58 60 63 66 68 71 74 76 79 82 84 87 90 92 95 98
[25] 100 103 106
> cseq(36, 109, c(3,3,2))
[1] 36 39 42 44 47 50 52 55 58 60 63 66 68 71 74 76 79 82 84 87 90 92 95 98
[25] 100 103 106 108
答案 2 :(得分:3)
如果您需要序列的特定元素
,这是一个非迭代解决方案f <- function(x){
d <- (x) %/% 3
r <- x %% 3
31 + d*8 + c(0,3,5)[r+1]
}
> f(1:10)
[1] 34 36 39 42 44 47 50 52 55 58