从R中的372列和12,000行的表开始,我需要创建一个新表,其中的列包含行,列的行数为1:4,然后是5:8,然后是9:12,依此类推至原始表格的第372栏。这是一个简短的例子:
输入:
m = structure(c(3L, 1L, 2L, 6L, 3L, 1L, 1L, 8L, 1L, 5L, 2L, 1L, 3L, 7L,
+ 1L, 1L), .Dim = c(2L, 8L), .Dimnames = list(c("r1", "r2"), c("a", "b",
+"c", "d", "e", "f", "g", "h")))
看起来像这样:
a b c d e f g h
r1 3 2 3 1 1 2 3 1
r2 1 6 1 8 5 1 7 1
预期产出:
A B
r1 9 7
r2 16 14
因此,A = a + b + c + d,B = e + f + g + h。使用Excel中的小桌子很容易。如果有帮助,列a-d对应于一个组,e-f对应另一个组。
答案 0 :(得分:4)
这个问题目前尚未明确,但假设你有一个矩阵......
m = structure(c(3L, 1L, 2L, 6L, 3L, 1L, 1L, 8L, 1L, 5L, 2L, 1L, 3L,
7L, 1L, 1L), .Dim = c(2L, 8L), .Dimnames = list(c("r1", "r2"),
c("a", "b", "c", "d", "e", "f", "g", "h")))
进行列映射:
map = data.frame(old = colnames(m), new = rep(LETTERS, each=4, length.out=ncol(m)))
old new
1 a A
2 b A
3 c A
4 d A
5 e B
6 f B
7 g B
8 h B
然后由它rowsum
:
res = rowsum(t(m), map$new)
r1 r2
A 9 16
B 7 14
我们必须在此处使用t
转置数据,因为R有rowsum
但没有colsum
。之后您可以将其转置回来,例如t(res)
。
答案 1 :(得分:3)
基础R解决方案,假设df
是您的数据框:
cols = 8
do.call(cbind, lapply(seq(1, ncols, 4), function(i) rowSums(df[i:(i+3)])))
# [,1] [,2]
# r1 9 7
# r2 16 14
答案 2 :(得分:0)
如果将原始数据转换为具有4列的矩阵,则可以以矢量化方式执行此操作,然后对其使用rowSums,然后将其转换回以匹配原始数据帧的行。这是一个长命令
df <- read.table(header = TRUE, text = "a b c d e f g h
3 2 3 1 1 2 3 1
1 6 1 8 5 1 7 1")
matrix(rowSums(matrix(as.vector(t(as.matrix(df))),
ncol = 4, byrow = TRUE)), ncol = ncol(df) / 4, byrow = TRUE)
# [,1] [,2]
#[1,] 9 7
#[2,] 16 14
编辑:保留行名称,例如rownames(df) <- c("r1", "r2")
,只需将它们应用于生成的矩阵(保留行顺序),即运行rownames(result) <- rownames(df)
。
答案 3 :(得分:0)
另一种方式:
df <- data.frame(t(matrix(colSums(matrix(t(df), nrow=4)),nrow=nrow(df))))
## X1 X2
##1 9 7
##2 16 14
4 x (ncol(df)/4 * now(df))
矩阵,现在每个列都是原始数据框中每行的四列组。colSums