首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R数据中不同列的求和

R数据中不同列的求和
EN

Stack Overflow用户
提问于 2014-04-24 10:20:52
回答 3查看 934关注 0票数 2

我有一个有144列和1000行的数据框架。它包含36个不同的变量,每个变量总是有4个值--看起来是这样的:

代码语言:javascript
复制
1a-1d   \t 2a-2d   \t 3a-3d..........36a-36d
2 1 4 5 \t 3 4 5 3 \t 32 1 3 1.......3 12 4 1
.
.
4 5 2 6 \t 4 5 2 6 \t 23 5 2 5......3 1 5 6

我想要做的是,总是把a到d和起来,并用向量的元素命名输出,例如names=c("AC_syn","AC_non",...)

我想这个命令一定是这样的:

代码语言:javascript
复制
ddply(a, .(), summarise, names[1]=a[,1]+a[,2]+a[,3]+a[,4], ...)

但一定有更优雅的方法吗?没有太多的复制粘贴工作?我对每一个想法都很高兴,也没有什么帮助!

很抱歉我没说清楚。实际上,我希望在每第四步(1-4,5-8……141-144)之后得到列的和,并用向量中的变量重命名新的数据。因此,对于输入:

代码语言:javascript
复制
2 1 4 5 \t 3 4 5 3 \t 32 1 3 1.......3 12 4 1

它应该回答

代码语言:javascript
复制
12 15 37.....20
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-24 11:58:16

如果你想每四列加一次

代码语言:javascript
复制
# example data
set.seed(1)

(df <- data.frame(replicate(8,rnorm(5))))

          X1         X2         X3          X4          X5          X6          X7
#1 -0.6264538 -0.8204684  1.5117812 -0.04493361  0.91897737 -0.05612874  1.35867955
#2  0.1836433  0.4874291  0.3898432 -0.01619026  0.78213630 -0.15579551 -0.10278773
#3 -0.8356286  0.7383247 -0.6212406  0.94383621  0.07456498 -1.47075238  0.38767161
#4  1.5952808  0.5757814 -2.2146999  0.82122120 -1.98935170 -0.47815006 -0.05380504
#5  0.3295078 -0.3053884  1.1249309  0.59390132  0.61982575  0.41794156 -1.37705956
          X8
#1 -0.4149946
#2 -0.3942900
#3 -0.0593134
#4  1.1000254
#5  0.7631757

为要和的列创建指示符--每四列之和一次。

代码语言:javascript
复制
(ind <- rep(1:2,each=4))
#[1] 1 1 1 1 2 2 2 2

根据ind的和列

代码语言:javascript
复制
t(rowsum(t(df),ind))

#              1          2
#[1,] 0.01992536  1.8065336
#[2,] 1.04472535  0.1292631
#[3,] 0.22529172 -1.0678292
#[4,] 0.77758346 -1.4212814
#[5,] 1.74295162  0.4238835

然后可以使用colnames分配列名。

票数 0
EN

Stack Overflow用户

发布于 2014-04-24 11:57:33

一种依靠矩阵乘法实现它的有趣方法:

首先,创建一个只有零和1的关联矩阵,以便对数据集进行后乘(假设它被称为df):

代码语言:javascript
复制
M = matrix(0, 144, 36)
M = (row(M) >= {(col(M)-1)*4 + 1} & row(M) < {(col(M)-1)*4 + 5})*1

然后将M乘成df并命名为列:

代码语言:javascript
复制
sumvar = as.matrix(df) %*% M
names(sumvar) = c("AC_syn","AC_non",...)

sumvar将有36列和1000行。以防万一,M看起来是这样的:

代码语言:javascript
复制
      [,1] [,2] [,3] [,4]...
[1,]    1    0    0    0
[2,]    1    0    0    0
[3,]    1    0    0    0
[4,]    1    0    0    0
[5,]    0    1    0    0
[6,]    0    1    0    0
[7,]    0    1    0    0
[8,]    0    1    0    0
...
票数 1
EN

Stack Overflow用户

发布于 2014-04-24 11:31:37

由于您的数据很小,所以使用FOR循环如何?这可能是一种粗俗的方式,但它仍然有效-

代码语言:javascript
复制
j=seq(1,141,4)
k=j+3
for(i in 1:length(names))
 {
   new_col <- paste("sum_",i)
   ds$new_col <- rowSums(ds[,j[i]:k[i]])   
 }

ds是您的数据集名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23266135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档