4

我想创建以下向量序列。

0 1 0 0 2 0 0 0 3 0 0 0 0 4

我的想法是先创建0rep()不确定如何添加1:4.

4

5 回答 5

8

创建一个对角矩阵,取上三角形,并删除第一个元素:

d <- diag(0:4)
d[upper.tri(d, TRUE)][-1L]
# [1] 0 1 0 0 2 0 0 0 3 0 0 0 0 4

如果您更喜欢不进行全局分配的单行,请将其包装在一个函数中:

(function() { d <- diag(0:4); d[upper.tri(d, TRUE)][-1L] })()
# [1] 0 1 0 0 2 0 0 0 3 0 0 0 0 4

出于代码高尔夫的目的,这是d从上面使用的另一个变体:

d[!lower.tri(d)][-1L]
# [1] 0 1 0 0 2 0 0 0 3 0 0 0 0 4
于 2017-08-06T22:19:02.803 回答
5

rep以及rbind他们的老把戏:

rep(rbind(0,1:4),rbind(1:4,1))
#[1] 0 1 0 0 2 0 0 0 3 0 0 0 0 4

这实质上创建了 2 个矩阵,一个用于值,一个用于重复值的次数。rep不关心输入是否是矩阵,因为它只会将其展平为按顺序向下排列的向量。

rbind(0,1:4)
#     [,1] [,2] [,3] [,4]
#[1,]    0    0    0    0
#[2,]    1    2    3    4

rbind(1:4,1)
#     [,1] [,2] [,3] [,4]
#[1,]    1    2    3    4
#[2,]    1    1    1    1
于 2017-08-06T22:47:34.077 回答
3
unlist(lapply(1:4, function(i) c(rep(0,i),i)))
于 2017-08-06T22:09:36.830 回答
3

您可以使用rep()创建具有n + 1每个值的序列:

n <- 4
myseq <- rep(seq_len(n), seq_len(n) + 1)
# [1] 1 1 2 2 2 3 3 3 3 4 4 4 4 4

然后你可以用它diff()来找到你想要的元素。您需要将 a 附加1diff()输出的末尾,因为您总是想要最后一个值。

c(diff(myseq), 1)
# [1] 0 1 0 0 1 0 0 0 1 0 0 0 0 1

然后你只需要将原始序列与diff()输出相乘。

myseq <- myseq * c(diff(myseq), 1)
myseq
# [1] 0 1 0 0 2 0 0 0 3 0 0 0 0 4
于 2017-08-06T22:14:12.193 回答
2
# the sequence
s = 1:4

# create zeros vector
vec = rep(0, sum(s+1))

# assign the sequence to the corresponding position in the zeros vector
vec[cumsum(s+1)] <- s

vec
# [1] 0 1 0 0 2 0 0 0 3 0 0 0 0 4

或者更简洁,使用replace

replace(rep(0, sum(s+1)), cumsum(s+1), s)
# [1] 0 1 0 0 2 0 0 0 3 0 0 0 0 4
于 2017-08-06T22:09:29.607 回答