0

我有一个带有一系列观察结果的向量(称为 t1)。我想通过从 t1 弹出第一个观察值来创建一组新向量(依此类推,以用于后续的近似副本)。但我想保持向量的长度相同,以便以后可以将它们添加到数据框中。

我能够使其工作如下:

t1 <- c(1, 2, 3)
t2 <- t1[-1]
t3 <- t2[-1]

t2[length(t2)+1] <- 0

t3[length(t3)+1] <- 0
t3[length(t3)+1] <- 0

t.all <- cbind(as.data.frame(t1), as.data.frame(t2), as.data.frame(t3))

t.all

  t1 t2 t3
1  1  2  3
2  2  3  0
3  3  0  0

但这很笨拙,如果我想创建大量列,这将是乏味的。如何使向量保持相同的长度(或以另一种方式解决此问题)?

4

5 回答 5

2

这是您尝试执行的操作的循环版本,udingdo.calllapply

cbind(t1,do.call(cbind,lapply(seq_along(t1)-1,
                     function(x)c(tail(t1,-x),rep(0,x)))))


    t1    
[1,]  1 2 3
[2,]  2 3 0
[3,]  3 0 0
于 2013-04-03T19:28:52.713 回答
1

这是使用向量索引的另一种方式:

t1 <- (2,5,3)
mm <- do.call(rbind, lapply(seq_along(t1), function(x) t1[x:length(t1)][1:length(t1)]))
#      [,1] [,2] [,3]
# [1,]    2    5    3
# [2,]    5    3   NA
# [3,]    3   NA   NA

mm[is.na(mm)] <- 0
#      [,1] [,2] [,3]
# [1,]    2    5    3
# [2,]    5    3    0
# [3,]    3    0    0

apply不使用家庭的另一种方法:

t1 <- c(2,5,4,6)
len <- length(t1)
matrix(t1[outer(1:len, 0:(len-1), '+')], ncol=len)

#      [,1] [,2] [,3] [,4]
# [1,]    2    5    4    6
# [2,]    5    4    6   NA
# [3,]    4    6   NA   NA
# [4,]    6   NA   NA   NA
于 2013-04-03T20:07:40.957 回答
1
> t.all <- sapply(0:2, function(x) c( t1[(x+1):3], rep(0,x) ) )
> t.all
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    3    0
[3,]    3    0    0

如果您需要它成为一个 data.frame,那么首先将其构建为矩阵然后环绕as.data.frame最终结果会更有效。

于 2013-04-03T20:21:47.737 回答
0

如何根据需要通过回收来逐行创建矩阵t1

tmat <-cbind(t1,t1,t1,t1,....) # as many as needed

然后只需使用矩阵三角形函数

newmat<- tmat * upper.tri(tmat,diag=TRUE) 

这与您的样本有偏差,但每行包含相同的信息。

于 2013-04-03T20:24:19.990 回答
0

大多数其他答案都集中在创建最终的 data.frame 上。如果那是您的最终目标,那么它们提供了很好的方法。相反,这个答案只关注您如何取下第一个元素并保留长度的问题。为了使事情保持整洁,最好在一个函数中完成整个事情。

shift <- function(tx) {append(tx[-1],0)}

然后你可以拥有

t1 <- c(1, 2, 3)
t2 <- shift(t1)
t3 <- shift(t2)

t.all <- data.frame(t1, t2, t3)

这给了你同样的结果。

> t.all
  t1 t2 t3
1  1  2  3
2  2  3  0
3  3  0  0

如果您想将此函数与循环构造结合起来创建 data.frame,最简单的方法是先通过矩阵。

t.all <- matrix(t1, nrow=length(t1), ncol=length(t1))
lapply(seq(length=length(t1))[-1], function(i) {
  t.all[,i] <<- shift(t.all[,(i-1)])
})
t.all <- as.data.frame(t.all)

它给出了相同的data.frame,但列名略有不同

> t.all
  V1 V2 V3
1  1  2  3
2  2  3  0
3  3  0  0
于 2013-04-03T20:38:41.267 回答