2014-11-03 2 views
1

Предполагается, что мои данные содержат 3 категории. Я хочу найти матрицу ковариации каждой категории и ожидать, что return будет массивом.Как найти матрицу ковариации по категориям в data.table в R

set.seed(7)  
x <- rbind(cbind(rnorm(120,-1,0.1), rnorm(120,-0.5,0.1)), 
       cbind(rnorm(120,-0.4,0.1), rnorm(120,0,0.1)), 
       cbind(rnorm(120,.2,0.1), rnorm(120,0,0.1))) 
lab <- c(rep(1, 120), rep(2, 120), rep(3, 120)) 
newx <- cbind(x, lab = lab) 
s <- sapply(1:3, function(k){ var(newx[lab == k, -3]) }) 
dim(s) <- c(2,2,3) 

возвращение,

, , 1 

      [,1]   [,2] 
[1,] 0.008880447 -0.001116058 
[2,] -0.001116058 0.009229061 

, , 2 

      [,1]   [,2] 
[1,] 0.012193536 -0.001217923 
[2,] -0.001217923 0.009391710 

, , 3 

      [,1]  [,2] 
[1,] 0.010752319 0.0
[2,] 0.0.008226595 

Я знаю, как сделать это с помощью sapply, но если я хочу использовать data.table, как я могу это сделать?

Я пробовал:

library(data.table) 
dt <- data.table(newx) 
dt[,lapply(.SD, var), by = lab] 

, но она не обеспечивает возврат как я ожидал.

+0

какой мощность вы хотите? таблица данных - это кадр данных, а не 3-мерный массив. – rawr

+0

@rawr. Я хочу получить следующий массив, содержащий ковариацию каждой категории. В этом случае у меня есть 3 категории, поэтому я ожидаю наличие 3 ковариационных матриц. – newbie

ответ

1

Если вам нужен результат как трехмерная матрица, то, очевидно, это не таблица данных. Однако вы можете использовать data.table для расчета.

library(data.table) 
DT <- as.data.table(newx) 
result <- DT[,var(.SD),by=lab] 
result <- as.matrix(result$V1) 
dim(result) <- c(2,2,3) 
result 
# , , 1 
# 
#    [,1]   [,2] 
# [1,] 0.008880447 -0.001116058 
# [2,] -0.001116058 0.009229061 
# 
# , , 2 
# 
#    [,1]   [,2] 
# [1,] 0.012193536 -0.001217923 
# [2,] -0.001217923 0.009391710 
# 
# , , 3 
# 
#    [,1]  [,2] 
# [1,] 0.010752319 0.0
# [2,] 0.0.008226595 
Смежные вопросы