Вычисление корреляции векторов по метке фактора

У меня есть два фрейма данных. Первый, df1, представляет собой матрицу векторов с помеченными столбцами, как показано ниже:

df1 <- data.frame(A=rnorm(10), B=rnorm(10), C=rnorm(10), D=rnorm(10), E=rnorm(10))

> df1

        A          B          C           D          E
-0.3200306  0.4370963 -0.9146660  1.03219577  0.5215359
-0.3193144  0.8900656 -1.1720264 -0.42591761  0.1936993
 0.4897262 -1.3970806  0.6054637  0.12487936  1.0149530
 0.3772420  0.8726322  0.3250020 -0.36952560 -0.5447512
-0.6921561 -0.6734468  0.3500812 -0.53373720 -0.6129472
 0.2540649 -1.1911106 -0.3266428  0.14013437  1.0830148
 0.6606825 -0.8942715  1.1099637 -1.52416540 -0.2383048
 1.4767074 -2.1492360  0.2441242 -0.36136344  0.5589114
-0.5338117 -0.2357821  0.7694879 -0.21652356  0.3185631
 3.4215916 -0.3157938  0.8895597  0.09946069 -1.0961730

Второй фрейм данных, df2, содержит элементы, соответствующие colnames из df1. Пример:

group <- c("1", "1", "2", "2", "3", "3")
S1 <- c("A", "D", "E", "C", "B", "D")
S2 <- c("D", "B", "A", "C", "B", "A")
S3 <- c("B", "C", "A", "E", "E", "A")
df2 <- data.frame(group,S1, S2, S3)

> df2

group S1 S2 S3
   1  A  D  B
   1  D  B  C
   2  E  A  A
   2  C  C  E
   3  B  B  E
   3  D  A  A

Я хотел бы вычислить корреляции между векторами-столбцами в df1, которые соответствуют помеченным элементам в df2. В частности, векторы, соответствующие cor(df2$S1, df2$S2) и cor(df2$S1, df2$S3).

Вывод должен быть примерно таким:

group S1 S2 S3   cor.S1.S2   cor.S1.S3
  1  A  D  B 0.003825055  -0.2817946
  1  D  B  C  -0.2817946  -0.4928023
  2  E  A  A  -0.3856809  -0.3856809
  2  C  C  E           1  -0.3862433
  3  B  B  E           1  -0.3888541
  3  D  A  A 0.003825055 0.003825055

Я пытался решить эту проблему с помощью cbind[], но продолжаю сталкиваться с такими проблемами, как ошибка 'x' must be numeric с cor. Заранее благодарю за любую помощь!


person amurphy    schedule 16.08.2015    source источник


Ответы (2)


Вы можете сделать это с помощью mapply().

my.cor <- function(x,y) {
  cor(df1[,x],df1[,y])
}

df2$cor.S1.S2 <- mapply(my.cor,df2$S1,df2$S2)
df2$cor.S2.S3 <- mapply(my.cor,df2$S2,df2$S3)
person johnson-shuffle    schedule 16.08.2015
comment
Большое спасибо! Я заметил, что если d1 является числовой матрицей, а не фреймом данных, он возвращает вектор NAs — в данном случае это не проблема. - person amurphy; 17.08.2015
comment
@amurphy Я немного изменил код, чтобы он работал, если df1 является фреймом данных или матрицей. - person johnson-shuffle; 17.08.2015

Другой подход заключается в том, чтобы получить корреляцию между matrix/data.frame после подмножества столбцов «df1» столбцами «df2», получить diag и назначить вывод как новый столбец в «df2». Здесь я использую lapply, так как мы должны сделать как «S1 против S2», так и «S1 против S3».

df2[c('cor.S1.S2', 'cor.S1.S3')] <-  lapply(c('S2', 'S3'), 
              function(x) diag(cor(df1[, df2[,x]], df1[,df2$S1])))
person akrun    schedule 17.08.2015