[英]Sum different columns in R dataframe
我有一個包含144列和1000行的數據框。 它包含36個不同的變量,每個變量總是4個值-看起來是這樣的:
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",...)
。
我認為命令一定是這樣的:
ddply(a, .(), summarise, names[1]=a[,1]+a[,2]+a[,3]+a[,4], ...)
但是必須有更優雅的方法嗎? 沒有太多的復制粘貼工作? 我為每個主意感到高興,幾乎沒有幫助!
抱歉,我沒有說清楚。 實際上,我想在每四個步驟(1-4,5-8 .... 141-144)之后獲得列的總和,並使用向量中給定的變量重命名新的數據框。 因此對於輸入:
2 1 4 5 \t 3 4 5 3 \t 32 1 3 1.......3 12 4 1
應該回復
12 15 37.....20
依靠矩陣乘法的有趣方法:
首先創建一個只有零和一的關聯矩陣,以對數據集進行后乘(假設它稱為df):
M = matrix(0, 144, 36)
M = (row(M) >= {(col(M)-1)*4 + 1} & row(M) < {(col(M)-1)*4 + 5})*1
然后將M乘以df並命名列:
sumvar = as.matrix(df) %*% M
names(sumvar) = c("AC_syn","AC_non",...)
sumvar將具有36列和1000行。 以防萬一,M看起來像這樣:
[,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
...
由於您的數據很小,因此FOR循環如何。 這可能是一種粗略的方法,但是仍然有效-
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是您的數據集名稱。
如果要每四列求和
# 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
創建要匯總的列的指標-每四列求和
(ind <- rep(1:2,each=4))
#[1] 1 1 1 1 2 2 2 2
根據ind求和的列
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
指定列名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.