我有一个数据框(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循环。这样的事情可以通过功能完成吗?
答案 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