如何对R中数据帧中特定数量的列求和?

如何对R中数据帧中特定数量的列求和?,r,loops,split,R,Loops,Split,我有一个数据帧(cenMca),有1020行和800列 每4列有一组数据,我称之为“cen”。从第1列到第4列,我有cen1,从第5列到第8列,我有cen2,依此类推 我想将cenMca拆分为200个更小的数据帧,其尺寸等于1020行乘以4列,并对每行的值求和。为此,我将对每一行应用一个函数和,然而,我搜索了按我想要的方式拆分数据帧的方法,但没有成功。此外,我不知道如何迭代这些较小的数据帧,以使用不同的名称保存每个数据帧 因此,我认为,与其将cenMca分解为更小的数据帧,不如将cenMca中的

我有一个数据帧(cenMca),有1020行和800列

每4列有一组数据,我称之为“cen”。从第1列到第4列,我有cen1,从第5列到第8列,我有cen2,依此类推

我想将cenMca拆分为200个更小的数据帧,其尺寸等于1020行乘以4列,并对每行的值求和。为此,我将
对每一行应用
一个函数和,然而,我搜索了按我想要的方式拆分数据帧的方法,但没有成功。此外,我不知道如何迭代这些较小的数据帧,以使用不同的名称保存每个数据帧

因此,我认为,与其将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]   
    }

  }
用于
的第一个
贯穿行,用于
的第二个
贯穿列。对于第二个
,我的增量是4,因为这样我就可以在一个周期内得到我想要的所有四个值

我知道这远远不够有效,但我认为它会起作用。 在我运行脚本之后,我得到了以下信息:

我尝试了
warnings()
,但没有结果。我在sumvec只有“NA”

我怎样才能解决这个问题?
其他技术如何做到这一点将不胜感激。谢谢。

这就是你想要实现的目标吗

我将创建一个示例矩阵(如果它是数据帧,也可以使用)

然后按四个一组添加列:

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

这就是你想要达到的目标吗

我将创建一个示例矩阵(如果它是数据帧,也可以使用)

然后按四个一组添加列:

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
中的NAs可能是
cenMca
中NAs的结果。如果在
cenMca
中有NAs,请使用
sum
而不是
+

for (j in seq(1,800,4)) sumvec[,(j+3)/4] <- apply(cenMca[,j:(j+3)],1,sum, na.rm=T)

对于(seq(1800,4)中的j)sumvec[,(j+3)/4]首先,您不需要在行上循环。R与向量配合得很好

其次,
sumvec
中的NAs可能是
cenMca
中NAs的结果。如果在
cenMca
中有NAs,请使用
sum
而不是
+

for (j in seq(1,800,4)) sumvec[,(j+3)/4] <- apply(cenMca[,j:(j+3)],1,sum, na.rm=T)

for(j in seq(1800,4))sumvec[,(j+3)/4]这似乎是
行和的一个很好的应用程序。您可以使用
lappy
在分组的列上运行它,就像您正在尝试的那样

我将使用与@R.Schifini类似的数据设置:

set.seed(1)
z <- matrix( rnorm( 1020*800 ), ncol = 800 )
使用所需的列名将其绑定为单个数据帧

x <- as.data.frame( x, col.names = paste0( "cen", seq_along( x ) ) )

对于
行和
,这似乎是一个很好的应用程序。您可以使用
lappy
在分组的列上运行它,就像您正在尝试的那样

我将使用与@R.Schifini类似的数据设置:

set.seed(1)
z <- matrix( rnorm( 1020*800 ), ncol = 800 )
使用所需的列名将其绑定为单个数据帧

x <- as.data.frame( x, col.names = paste0( "cen", seq_along( x ) ) )

请展示一个小的可复制示例请展示一个小的可复制示例您可能会发现
行和
比您的
应用(…1,sum…
调用更有效。您是对的。我一直忘了
rowsumes
也能很好地处理数据帧:)谢谢你提醒我。你可能会发现
rowsumes
比你的
apply(…1,sum…
调用更有效。你是对的。我一直忘了
rowSums
也适用于数据帧:)谢谢你提醒我。嘿,罗斯科娃。谢谢你的意见。但是,我尝试运行您的代码,每次我点击lappy块时,都会出现以下错误:“行和中的错误(cenMca[,x:(x+3)]:‘x’必须是数字”。在typeof中,我看到“x”是字符。我试图用一个1020*200的矩阵来代替x,但没有成功。这一步在
lappy
调用中,因此
x
是迭代器。换句话说,
x
seq.int(1,ncol(z),4)
的所有值,一个接一个地取,但只为
lappy
创建并在其中使用(您不能在
lappy
调用之外真正检查它的类,因为它在
lappy
运行之前并不真正存在)。如果您在其他地方使用
x
,您可以选择不同的迭代器,例如
…函数(i){rowSums(z[,i:+3)]}…
。再次感谢您的反馈。我做了必要的调整,一切正常。很高兴听到你这么说!使用
x
作为迭代器和输出对我来说都是不好的形式,所以我在答案中也对其进行了更改,以使其他人更清楚。嘿,罗斯科娃。谢谢你的意见。但是,我尝试运行您的代码,每次我点击lappy块时,都会出现以下错误:“行和中的错误(cenMca[,x:(x+3)]:‘x’必须是数字”。在typeof中,我看到“x”是字符。我试图用一个1020*200的矩阵来代替x,但没有成功。这一步在
lappy
调用中,因此
x
是迭代器。换句话说,
x
seq.int(1,ncol(z),4)
的所有值,一个接一个地取,但只为
lappy
创建并在其中使用(您不能在
lappy
调用之外真正检查它的类,因为它在
lappy
运行之前并不真正存在)。如果您在其他地方使用
x
,您可以选择不同的迭代器,例如
…函数(i){rowSums(z[,i:+3)]}…
。再次感谢您的反馈。我做了必要的调整,一切正常。很高兴听到你这么说!使用
x
作为迭代器和输出对我来说都是不好的形式,所以我在回答中也对其进行了更改,以使其他人更清楚。