#r #pearson
Вопрос:
У меня есть фрейм данных следующим образом:
x <- data.frame(Name=c("a", "b","c", "d", "e"),A=(1:5), B=(2:6), C=(7:11), D=c(1,1,1,1,1))
Я хочу получить фрейм данных, включающий все коэффициенты Пирсона a vs b, a vs c, a vs d, a vs e, b vs a, b vs c, b vs d, b vs e…. и т. Д. (Исключая самосопоставления, т. Е. a-a, b-b и т. Д.).
Другими словами, я хочу изменить следующий фрейм данных
A B C D
a 1 2 7 1
b 2 3 8 1
c 3 4 9 1
d 4 5 10 1
e 5 6 11 1
К результирующему кадру данных, подобному этому
a b 0.989143436
a c 0.963282002
a d 0.93048421
a e 0.89585579
b c 0.9922798
b d 0.974216034
b e 0.951427811
c d 0.994675789
c e 0.982264673
d e 0.996357429
Пожалуйста, любезно проинструктируйте эффективный способ сделать это.
Редактировать
Спасибо за помощь Michaelv2.
Основываясь на предложенном коде, я обнаружил, что результаты выглядят следующим образом:
X1 X2 value
1 A A 1
2 B A 1
3 C A 1
4 D A NA
5 A B 1
6 B B 1
7 C B 1
8 D B NA
9 A C 1
10 B C 1
11 C C 1
12 D C NA
13 A D NA
14 B D NA
15 C D NA
16 D D 1
Сообщение об ошибке »
Предупреждающее сообщение:
В кор(x[2:5], метод = «пирсон») : стандартное отклонение равно нулю»
Мне кажется, что я, возможно, неправильно использовал код, не могли бы вы, пожалуйста, дополнительно проинструктировать, как решить эту проблему дальше? Спасибо.
Ответ №1:
Вы могли бы использовать что-то вроде следующего:
require(reshape)
y <- as.data.frame(t(x[2:5]), stringsAsFactors=FALSE)
colnames(y) <- x[[1]]
yrho <- melt(cor(y, method="pearson"))
subset(yrho, yrho$X1 != yrho$X2)
Результат:
X1 X2 value
2 b a 0.9891434
3 c a 0.9632820
4 d a 0.9304842
5 e a 0.8958558
6 a b 0.9891434
8 c b 0.9922798
9 d b 0.9742160
10 e b 0.9514278
11 a c 0.9632820
12 b c 0.9922798
14 d c 0.9946758
15 e c 0.9822647
16 a d 0.9304842
17 b d 0.9742160
18 c d 0.9946758
20 e d 0.9963574
21 a e 0.8958558
22 b e 0.9514278
23 c e 0.9822647
24 d e 0.9963574
Комментарии:
1. Ну, метки строк могут быть метками строк, тогда нет необходимости их опускать. Кроме того, оператору требовались корреляции между строками, а не между столбцами (но одна
t
из них выполнит эту работу).2. Технически я опустил первый столбец фрейма данных (вектор символов или факторов, в зависимости от ваших настроек), а не метки строк, но вы совершенно правы в отношении корреляций по строкам. Спасибо, что указали на это.