2013-12-11 42 views
1

我有一个包含1127列和314行的数据帧(m2)。从第1列开始,我需要将第5列中的值替换为邻接列中的第1个值。我已经能够单独的列列名此处选择这样做:如何用邻接列中的值替换每个第n列中的值

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

这很难不实际的数据来检查,但我想你的意思:

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

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

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

+0

似传我最小的测试。 –

+0

@DWin是的,但如果ncol是26,那么最后一个adj将是27非列。所以它回答了Q和具体数据,但没有更多。 –

+0

是的,有相邻的列。这工作完美。当看起来如此困难的事情有如此简单的答案时,它总是谦卑。谢谢。 – user3093050

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 
+0

谢谢迪文,我试过这个,它也工作。我花了一点时间才弄清楚它是如何工作的。我的主要关键点是试图做到这一点,而不是按专栏名称选择,这两个答案都提供了一种手段。 – user3093050