2013-12-11 46 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