我怎样才能创建这个特殊序列?
How can I create this special sequence?
我想创建以下向量序列。
0 1 0 0 2 0 0 0 3 0 0 0 0 4
我的想法是先用 rep()
创建 0
,但不确定如何添加 1:4
。
# 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
unlist(lapply(1:4, function(i) c(rep(0,i),i)))
您可以使用 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()
来查找您想要的元素。您需要将 1
附加到 diff()
输出的末尾,因为您总是需要最后一个值。
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
创建对角矩阵,取上三角,并删除第一个元素:
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
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
我想创建以下向量序列。
0 1 0 0 2 0 0 0 3 0 0 0 0 4
我的想法是先用 rep()
创建 0
,但不确定如何添加 1:4
。
# 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
unlist(lapply(1:4, function(i) c(rep(0,i),i)))
您可以使用 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()
来查找您想要的元素。您需要将 1
附加到 diff()
输出的末尾,因为您总是需要最后一个值。
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
创建对角矩阵,取上三角,并删除第一个元素:
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
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