如何使用相邻列中的值替换每个第n列中的值

时间:2013-12-11 22:19:51

标签: r replace dataframe

我有一个数据框(m2),包含1127列和314行。从第1列开始,我需要将每个第5列中的值替换为相邻列中的第1个值。我已经能够按列名称选择单个列,如下所示:

m2$Col1<-m2[1,2]
m2$Col6<-m2[1,7]
m2$Col11<-m2[1,12]

或通过非常笨重的重新分配/重组:

newcol1<-replace(m2[,1],1:314,m2[1,2])
m2<-cbind(newcol1,m2[,2:1127])
newcol2<-replace(m2[,6],1:314,m2[1,7])
m2<-cbind(m2[,1:5],newcol2,m2[,7:1127])
newcol3<-replace(m2[,11],1:314,m2[1,12])
m2<-cbind(m2[,1:10],newcol3,m2[,12:1127])

我希望找到一种方法来自动化数据框。我还没有识别for循环。这样的事情可以通过功能完成吗?

2 个答案:

答案 0 :(得分:2)

如果没有实际数据检查很困难,但我认为你的意思是:

  #all the fifth cols
  fifth= seq(1, ncol(m), 5)
  # and the adjacent
  adj= fifth+1

  m[,fifth]= m[1,adj]

NB 这不会检查列的正确性,即是否存在相邻列。我只是从你的描述中假设有。

答案 1 :(得分:0)

最初的想法;

m2[, c(TRUE, rep(FALSE,4) )] <- m2[ , c(FALSE, TRUE, FALSE,FALSE,FALSE) ]

那是在考虑这是一个专栏替换,但重新阅读这个问题,似乎没有;

也许:

m2[, c(TRUE, rep(FALSE,4) )] <- rep( m2[1 , c(FALSE, TRUE, FALSE,FALSE,FALSE) ], each=nrow(m2) )

但就是这样,它需要一个非列表操作来提供经过测试的解决方案:

 m2 <- as.data.frame(matrix(1:150, nrow=10))  
m2[, c(TRUE, rep(FALSE,4) )] <- 
                  unlist(rep( m2[ 1, c(FALSE, TRUE, FALSE,FALSE,FALSE) ], each=nrow(m2) ))
> m2
   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15
1  11 11 21 31 41 61 61 71 81  91 111 111 121 131 141
2  11 12 22 32 42 61 62 72 82  92 111 112 122 132 142
3  11 13 23 33 43 61 63 73 83  93 111 113 123 133 143
4  11 14 24 34 44 61 64 74 84  94 111 114 124 134 144
5  11 15 25 35 45 61 65 75 85  95 111 115 125 135 145
6  11 16 26 36 46 61 66 76 86  96 111 116 126 136 146
7  11 17 27 37 47 61 67 77 87  97 111 117 127 137 147
8  11 18 28 38 48 61 68 78 88  98 111 118 128 138 148
9  11 19 29 39 49 61 69 79 89  99 111 119 129 139 149
10 11 20 30 40 50 61 70 80 90 100 111 120 130 140 150