#r #correlation #columnname
#r #фрейм данных #корреляция #r-имена столбцов
Вопрос:
Я пытаюсь вычислить корреляцию между двумя столбцами во фрейме данных на основе совпадающего шаблона в имени столбца. В этом случае я хочу получить корреляцию между столбцами ‘Obs1_grp1’ и ‘Obs1_grp2’, ‘Obs2_grp1’ и ‘Obs2_grp2’ и так далее.
> test
Individual Obs1_grp1 Obs2_grp1 Obs3_grp1 Obs1_grp2 Obs2_grp2 Obs3_grp2
1 293748 1583 0.09858 0.7639 15.70 0.5877 3230
2 294934 1353 0.11090 0.7639 15.58 0.5697 3604
3 290652 1400 0.11030 0.7639 14.93 0.5779 3462
4 291320 1377 0.11480 0.7639 15.63 0.5706 3130
5 292553 1253 0.10640 0.7639 15.41 0.5750 3601
6 295073 1306 0.09881 0.7639 15.54 0.5829 3630
7 290966 1523 0.10960 0.7639 15.48 0.5724 3274
8 293501 1472 0.10090 0.7639 15.31 0.5764 3507
9 295464 1603 0.10000 0.7639 15.66 0.5816 3512
10 291367 1476 0.09944 0.7639 15.38 0.5805 3116
11 295007 1517 0.11290 0.7639 14.98 0.5773 3130
12 295006 1340 0.11290 0.7639 14.98 0.5773 3130
13 290570 1314 0.10000 0.7639 15.45 0.5806 3759
14 293940 1515 0.10350 0.7639 15.55 0.5824 3564
15 293925 1259 0.10890 0.7639 15.15 0.5757 3593
16 291353 1494 0.09944 0.7639 15.38 0.5805 3116
17 292783 1637 0.10180 0.7639 15.38 0.5754 3396
18 290833 1202 0.11030 0.7639 13.66 0.5743 3106
19 291826 1298 0.10570 0.7639 16.26 0.5786 3946
20 294410 1539 0.10070 0.7639 15.39 0.5829 3550
Я думал использовать функцию grep, но не уверен, как это сделать?
Кроме того, я хотел бы поместить вычисленную корреляцию в таблицу данных и указать для каждой корреляции Obs. Что-то вроде этого:
> correl
Obs cor
1 Obs1 0.853
2 Obs2 0.952
Надеюсь, что кто-нибудь может здесь помочь.
Комментарии:
1.
cor(test[,-1])
2. Это даст корреляции между всеми столбцами, однако я хочу, чтобы они были между конкретными столбцами; например, ‘Obs1_grp1’ и ‘Obs1_grp2’, ‘Obs2_grp1’ и ‘Obs2_grp2’ и так далее…
3. Почему бы не создать имена переменных, а затем продолжить, если имена столбцов должны оставаться согласованными?
Ответ №1:
Вы можете создать функцию, подобную этой:
cor_f <- function(x) {
cor(test[,names(test)[grepl(x, names(test))]])[2]
}
cor_f('Obs1') #correlation between Obs1_grp1 and Obs1_grp2
#0.3159908
В случае, если вам нужен цикл, одним из способов может быть:
vars <- c('Obs1', 'Obs2')
sapply(vars, function(i) cor_f(i))