簡體   English   中英

如何對R中的數據框中的特定列數求和?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM