Средства для каждой строки по группам столбцов, петли - PullRequest
0 голосов
/ 30 января 2020

Мне нужно вычислить средние значения для каждой строки в данных для каждой группы столбцов, поэтому я хочу использовать для нее значение al oop, потому что мое измерение даты составляет около 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])

Как я могу сделать все oop для rowMeans для вычисления средних значений для каждой группы столбцов, таких как'var a ',' var b "и т. д. c. Я новичок в R, поэтому любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Мы можем использовать 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"

data

Предполагается, что 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")))
0 голосов
/ 30 января 2020

Вот решение с использованием 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
...