如何对R中数据帧中特定数量的列求和?
我有一个数据帧(cenMca),有1020行和800列 每4列有一组数据,我称之为“cen”。从第1列到第4列,我有cen1,从第5列到第8列,我有cen2,依此类推 我想将cenMca拆分为200个更小的数据帧,其尺寸等于1020行乘以4列,并对每行的值求和。为此,我将如何对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分解为更小的数据帧,不如将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
作为迭代器和输出对我来说都是不好的形式,所以我在回答中也对其进行了更改,以使其他人更清楚。