将数据框中的每一行逐渐向右移动

Shift each row in dataframe increasingly to the right

我想要一个像这样的数据框,例如:

example=data.frame(a=c(1,2,3,4,5,6,7,8), b=c(1,2,3,4,5,6,7,8), c=c(1,2,3,4,5,6,7,8), d = c(1,2,3,4,5,6,7,8))

  a b c d
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
6 6 6 6 6
7 7 7 7 7
8 8 8 8 8

进行变形,使第一行保持在同一位置,但之后的每一行都从上一行向右移动一列,例如:

   a  b  c  d  X X.1 X.2 X.3 X.4 X.5 X.6
1  1  1  1  1 NA  NA  NA  NA  NA  NA  NA
2 NA  2  2  2  2  NA  NA  NA  NA  NA  NA
3 NA NA  3  3  3   3  NA  NA  NA  NA  NA
4 NA NA NA  4  4   4   4  NA  NA  NA  NA
5 NA NA NA NA  5   5   5   5  NA  NA  NA
6 NA NA NA NA NA   6   6   6   6  NA  NA
7 NA NA NA NA NA  NA   7   7   7   7  NA
8 NA NA NA NA NA  NA  NA   8   8   8   8

这是为了可以对每一列进行求和(我的意思是对于每个新列,行将被加在一起,但列标题没有意义,因此移动它们并不重要),因此列名并不特别重要。

任何帮助将不胜感激,因为我还没有偶然发现任何东西来实现这种数据转换。

编辑:感谢所有回答的人,所有的解决方案都很有效!

一种使用 NA 创建矩阵并填写所需值的简单方法。

Shifted = matrix(NA, nrow=nrow(example), 
    ncol=nrow(example) + ncol(example) - 1)
for(i in 1:nrow(example)) {
    Shifted[i, i:(i+ncol(example)-1)] = unlist(example[i,]) }

如果你真的想要 data.frame,你可以用

结束
as.data.frame(Shifted)

这是另一个基础 R for 循环。我先构造矩阵,再填充。

# build matrix of missing values
myMat <- matrix(NA, nrow(example), ncol(example) + nrow(example) - 1)

# fill it in by row with vector pulled from row of example and simiplified with `unlist`
for(i in seq_len(nrow(myMat))) {
  myMat[i, i:(ncol(example) + i - 1)] <- unlist(example[i,], use.names=FALSE)
}

这个returns

myMat
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
[1,]    1    1    1    1   NA   NA   NA   NA   NA    NA    NA
[2,]   NA    2    2    2    2   NA   NA   NA   NA    NA    NA
[3,]   NA   NA    3    3    3    3   NA   NA   NA    NA    NA
[4,]   NA   NA   NA    4    4    4    4   NA   NA    NA    NA
[5,]   NA   NA   NA   NA    5    5    5    5   NA    NA    NA
[6,]   NA   NA   NA   NA   NA    6    6    6    6    NA    NA
[7,]   NA   NA   NA   NA   NA   NA    7    7    7     7    NA
[8,]   NA   NA   NA   NA   NA   NA   NA    8    8     8     8