表示每行按列组,循环
Means for each row by groups of columns, loop
我需要为每组列的数据中的每一行计算均值,因此我想为其使用一个循环,因为我的日期维度约为 500 000x1000。
我的数据看起来像这样:
var a1 var a2 var b1 var b2 var c1 var c2 var d1 var d2 var e1 var e2
[1,] 7 9 9 8 3 5 1 1 7 8
[2,] 3 9 9 9 6 6 8 1 9 5
[3,] 7 8 10 8 7 5 2 3 9 7
[4,] 5 10 7 4 6 1 6 1 9 3
我可以用这种方式计算均值,效果很好,但我有大约 200 个组
rowMeans(x[,1:2])
如何为 rowMeans 创建一个循环来计算每组列的均值,例如“var a”、“var b”等。
我是 R 的新手,所以非常感谢任何帮助。
我们可以使用split.default
根据公共列名拆分列,然后对每个列表取rowMeans
。
sapply(split.default(data.frame(x), sub("var(.)\d+", "\1",colnames(x))), rowMeans)
# a b c d e
#[1,] 8.0 8.5 4.0 1.0 7.5
#[2,] 6.0 9.0 6.0 4.5 7.0
#[3,] 7.5 9.0 6.0 2.5 8.0
#[4,] 7.5 5.5 3.5 3.5 6.0
其中
sub("var(.)\d+", "\1",colnames(x)) #returns
#[1] "a" "a" "b" "b" "c" "c" "d" "d" "e" "e"
数据
假设x
是一个矩阵。
x <- structure(c(7L, 3L, 7L, 5L, 9L, 9L, 8L, 10L, 9L, 9L, 10L, 7L,
8L, 9L, 8L, 4L, 3L, 6L, 7L, 6L, 5L, 6L, 5L, 1L, 1L, 8L, 2L, 6L,
1L, 1L, 3L, 1L, 7L, 9L, 9L, 9L, 8L, 5L, 7L, 3L), .Dim = c(4L,
10L), .Dimnames = list(NULL, c("vara1", "vara2", "varb1", "varb2",
"varc1", "varc2", "vard1", "vard2", "vare1", "vare2")))
这是一个使用 3 维数组的解决方案:
x <- read.table(text=
" 7 9 9 8 3 5 1 1 7 8
3 9 9 9 6 6 8 1 9 5
7 8 10 8 7 5 2 3 9 7
5 10 7 4 6 1 6 1 9 3")
x <- as.matrix(x)
apply(array(x, dim=c(4, 2, ncol(x)/2)), c(1,3), mean)
# > apply(array(x, dim=c(4, 2, ncol(x)/2)), c(1,3), mean)
# [,1] [,2] [,3] [,4] [,5]
# [1,] 8.0 8.5 4.0 1.0 7.5
# [2,] 6.0 9.0 6.0 4.5 7.0
# [3,] 7.5 9.0 6.0 2.5 8.0
# [4,] 7.5 5.5 3.5 3.5 6.0
为了生成漂亮的列名,您可以这样做(解决方案类似于@Ronak 的解决方案):
x <- as.matrix(x)
colnames(x) <- c("vara1", "vara2", "varb1", "varb2", "varc1", "varc2", "vard1", "vard2", "vare1", "vare2") # original colnames
y <- apply(array(x, dim=c(4, 2, ncol(x)/2)), c(1,3), mean)
cn <- colnames(x)[c(TRUE, FALSE)]
colnames(y) <- sub("var(.*)\d+", "\1", cn)
y
我需要为每组列的数据中的每一行计算均值,因此我想为其使用一个循环,因为我的日期维度约为 500 000x1000。 我的数据看起来像这样:
var a1 var a2 var b1 var b2 var c1 var c2 var d1 var d2 var e1 var e2
[1,] 7 9 9 8 3 5 1 1 7 8
[2,] 3 9 9 9 6 6 8 1 9 5
[3,] 7 8 10 8 7 5 2 3 9 7
[4,] 5 10 7 4 6 1 6 1 9 3
我可以用这种方式计算均值,效果很好,但我有大约 200 个组
rowMeans(x[,1:2])
如何为 rowMeans 创建一个循环来计算每组列的均值,例如“var a”、“var b”等。 我是 R 的新手,所以非常感谢任何帮助。
我们可以使用split.default
根据公共列名拆分列,然后对每个列表取rowMeans
。
sapply(split.default(data.frame(x), sub("var(.)\d+", "\1",colnames(x))), rowMeans)
# a b c d e
#[1,] 8.0 8.5 4.0 1.0 7.5
#[2,] 6.0 9.0 6.0 4.5 7.0
#[3,] 7.5 9.0 6.0 2.5 8.0
#[4,] 7.5 5.5 3.5 3.5 6.0
其中
sub("var(.)\d+", "\1",colnames(x)) #returns
#[1] "a" "a" "b" "b" "c" "c" "d" "d" "e" "e"
数据
假设x
是一个矩阵。
x <- structure(c(7L, 3L, 7L, 5L, 9L, 9L, 8L, 10L, 9L, 9L, 10L, 7L,
8L, 9L, 8L, 4L, 3L, 6L, 7L, 6L, 5L, 6L, 5L, 1L, 1L, 8L, 2L, 6L,
1L, 1L, 3L, 1L, 7L, 9L, 9L, 9L, 8L, 5L, 7L, 3L), .Dim = c(4L,
10L), .Dimnames = list(NULL, c("vara1", "vara2", "varb1", "varb2",
"varc1", "varc2", "vard1", "vard2", "vare1", "vare2")))
这是一个使用 3 维数组的解决方案:
x <- read.table(text=
" 7 9 9 8 3 5 1 1 7 8
3 9 9 9 6 6 8 1 9 5
7 8 10 8 7 5 2 3 9 7
5 10 7 4 6 1 6 1 9 3")
x <- as.matrix(x)
apply(array(x, dim=c(4, 2, ncol(x)/2)), c(1,3), mean)
# > apply(array(x, dim=c(4, 2, ncol(x)/2)), c(1,3), mean)
# [,1] [,2] [,3] [,4] [,5]
# [1,] 8.0 8.5 4.0 1.0 7.5
# [2,] 6.0 9.0 6.0 4.5 7.0
# [3,] 7.5 9.0 6.0 2.5 8.0
# [4,] 7.5 5.5 3.5 3.5 6.0
为了生成漂亮的列名,您可以这样做(解决方案类似于@Ronak 的解决方案):
x <- as.matrix(x)
colnames(x) <- c("vara1", "vara2", "varb1", "varb2", "varc1", "varc2", "vard1", "vard2", "vare1", "vare2") # original colnames
y <- apply(array(x, dim=c(4, 2, ncol(x)/2)), c(1,3), mean)
cn <- colnames(x)[c(TRUE, FALSE)]
colnames(y) <- sub("var(.*)\d+", "\1", cn)
y