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

时间:2017-03-03 15:40:28

标签: r dataframe transformation

我希望有一个这样的数据框,例如:

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

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

任何帮助都会非常感激,因为我还没有发现任何事情来实现这种数据转换。

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

2 个答案:

答案 0 :(得分:0)

使用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)

答案 1 :(得分:0)

这是循环的另一个基础R.我首先构造矩阵,然后将其填入。

# 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)
}

返回

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