#r #conditional-statements #correlation
#r #условные операторы #корреляция
Вопрос:
У меня есть: данные (анкета) из пяти переменных (от V1 до V5), на каждую из которых дан ответ по шкале от 1 до 6.
Я хотел бы вычислить следующие корреляции: возьмите V1 в качестве условия и для каждого возможного значения V1 вычислите корреляцию (V2 V3) с (V4 плюс V5). По сути: посмотрите только на случаи, когда V1 = 1, и вычислите значение V2 V3 с помощью V4 V5; затем для V1 = 2 и так далее.
Я хотел бы записать это в цикле, но не могу заставить это работать. Я думаю, что можно было бы вручную добавить столбцы, содержащие суммы, а затем отсортировать данные с помощью пакета dplyr, но это кажется очень неуклюжим.
**Example Data**
ID V1 V2 V3 V4 V5
61617 3 4 2 2 3
61618 3 3 3 5 5
61620 4 5 4 2 3
61621 2 5 2 4 1
61622 2 3 4 4 3
61623 3 5 2 2 3
61624 1 2 2 1 1
Даже для начала я вручную попробовал безусловную корреляцию сумм cor(sum(V$V2,V$V3),sum(V$V4,V$V5),use="pairwise.complete")
, которая также дала NA.
Я пробовал операторы ifelse
и rowSums
, но безрезультатно. Как я могу подойти к этому как не программист?
Ответ №1:
Это может быть легко достигнуто с помощью dplyr
pacakge.
library(dplyr)
df %>%
group_by(V1) %>%
summarise(cor = cor(V2 V3, V4 V5))
# # A tibble: 6 x 2
# V1 cor
# <int> <dbl>
# 1 1 0.111
# 2 2 0.0434
# 3 3 0.140
# 4 4 0.0791
# 5 5 -0.0298
# 6 6 0.103
Данные
set.seed(123)
df <- as.data.frame(matrix(sample(1:6, 500, T), 100))
# V1 V2 V3 V4 V5
# 1 3 2 5 3 5
# 2 6 4 6 1 3
# 3 3 2 5 5 4
# 4 2 2 3 6 2
# 5 2 6 3 6 5
# … with 95 more rows
Ответ №2:
Один из вариантов:
sapply(
split(V, V$V1),
function(X) {
with(X, cor(V2 V3, V4 V5, use="pairwise.complete"))
}
)
# 2 3
# 0.9176629 -0.4714045
Воспроизводимые данные (модифицированные для меньшего количества групп):
V <- data.frame(
ID = c(61617L, 61618L, 61620L, 61621L, 61622L, 61623L, 61624L),
V1 = c(3L, 3L, 3L, 2L, 2L, 3L, 2L),
V2 = c(4L, 3L, 5L, 5L, 3L, 5L, 2L),
V3 = c(2L, 3L, 4L, 2L, 4L, 2L, 2L),
V4 = c(2L, 5L, 2L, 4L, 4L, 2L, 1L),
V5 = c(3L, 5L, 3L, 1L, 3L, 3L, 1L)
)