[英]How do I sum over specific number of columns in dataframe in R?
我有一個數據幀(cenMca),具有1020行和800列。
每隔4列,我就有一組數據稱為“ cen”。 因此,從列1到4,我有cen 1,從5到8,我有cen2,依此類推。
我想將cenMca拆分為200個較小的數據幀,這些數據幀的尺寸等於4列的1020行,並將每行的值求和。 為此,我apply
函數求和應用於每一行,但是,我尋找了以所需方式拆分數據框的方法,但這樣做失敗。 另外,我也不知道如何遍歷這些較小的數據框,以使用不同的名稱保存每個數據框。
因此,我認為不要將cenMca分解為較小的數據幀,而是將cenMca中的值求和,然后將它們分配給我稱為sumvec的單個數據幀。 因此,對於cenMca中的每4列,我在sumvec中會有一個對應的列。 這樣得出的sumvec尺寸等於1020行和200列。
為此,我嘗試:
sumvec = matrix(NA,1020,200)
for (i in 1:1020 ){
for (j in seq(1,800,4)){
sumvec[i,(j+3)/4] = cenMca[i,j]+cenMca[i,j+1]+cenMca[i,j+2]+cenMca[i,j+3]
}
}
第一個for
行,第二個for
列。 我的增量為4的第二for
,因為這樣我會得到所有四個值我在一個周期內通緝。
我知道這遠非高效,但我認為這會奏效。 運行腳本后,我得到了:
我嘗試了warnings()
但沒有任何反應。 我在sumvec中所擁有的只是“ NA”
我該如何解決? 其他有關如何做到這一點的技術將受到贊賞。 謝謝。
這是您要達到的目標嗎?
我將創建一個示例矩陣(如果它是一個數據框,也可以使用)
z = matrix(floor(runif(120, 0, 100)), ncol = 12)
> z
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,] 37 50 37 0 71 84 29 65 0 34 33 65
[2,] 53 60 17 44 39 94 16 66 72 12 27 32
[3,] 10 26 5 26 11 58 39 47 71 38 11 19
[4,] 80 42 65 93 24 50 45 96 18 92 4 11
[5,] 73 36 57 71 86 18 43 40 64 80 37 99
[6,] 5 94 98 16 43 0 51 84 54 75 33 37
[7,] 48 12 60 47 49 87 84 75 33 95 17 56
[8,] 92 7 6 69 69 13 5 53 63 99 62 73
[9,] 4 96 16 46 76 2 55 87 82 60 39 87
[10,] 29 44 47 95 15 93 68 46 70 2 95 57
然后以四組為一組添加列:
result = z[,seq(1,12,by = 4)]+z[,seq(2,12,by = 4)]+z[,seq(3,12,by = 4)]+z[,seq(4,12,by = 4)]
> result
[,1] [,2] [,3]
[1,] 124 249 132
[2,] 174 215 143
[3,] 67 155 139
[4,] 280 215 125
[5,] 237 187 280
[6,] 213 178 199
[7,] 167 295 201
[8,] 174 140 297
[9,] 162 220 268
[10,] 215 222 224
首先,您不需要遍歷行。 R與向量配合良好。
其次, sumvec
的NA可能是sumvec
的NA的cenMca
。 如果您在cenMca
有NA,請使用sum
而不是+
。
for (j in seq(1,800,4)) sumvec[,(j+3)/4] <- apply(cenMca[,j:(j+3)],1,sum, na.rm=T)
希望這可以幫助。
這似乎是rowSums
一個很好的應用程序。 您可以使用lapply
在試圖分組的列上運行它。
我將使用與@ R.Schifini類似的數據設置:
set.seed(1)
z <- matrix( rnorm( 1020*800 ), ncol = 800 )
使其像您的數據一樣成為數據框。
z <- as.data.frame(z)
現在,將數據幀分為4列,每組運行rowSums
。
x <- lapply( seq.int( 1, ncol(z), 4 ),
function(i) {
rowSums( z[ , i:(i+3) ] )
} )
將其與所需的列名稱綁定為一個數據框。
x <- as.data.frame( x, col.names = paste0( "cen", seq_along( x ) ) )
這是輸出的一小部分樣本。
> head( x[1:6] )
cen1 cen2 cen3 cen4 cen5 cen6
1 -0.8027240 -0.7437158 -1.5305678 -0.7055544 2.0122082 0.7851487
2 0.0854064 0.2422316 -2.5071390 1.7854231 -3.5219698 -0.7699433
3 1.2738387 1.7360087 1.4317099 -3.3501584 -1.8412381 -2.1396324
4 -0.5864149 -0.5648199 -0.3099392 -1.9144969 0.7874474 -2.4840934
5 -0.3887289 -1.0745042 -1.9729363 1.8971846 -4.3374676 2.5744197
6 0.9104741 -0.7546090 4.2516971 1.0335885 2.6814576 -0.2548666
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.