Как рассчитать корреляцию между переменными x и y в данных фрейма данных для каждой категории факторного кота? - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь сгенерировать функцию для вычисления корреляции между переменными age и views во фрейме данных data для каждой категории gender.

Мой фрейм данных называется tv_viewing с 5 столбцами: adhd (число c), sex (коэффициент, мальчик / девочка), famsize (коэффициент с 4 уровнями (1 ребенок, 2 ребенка, 3 ребенка, 4 + ребенок), age (число c) и views (число c, количество просмотров телевизора).

Я получил это далеко:

partcorr <- function(tv_viewing, age, views, sex) {
  corrs <- list()
  for(i(tv_viewing[,sex])) {
    corrs[i] <- round(sex(tv_viewing[tv_viewing[,sex] == i, age], tv_viewing[tv_viewing[,sex] == i, views], method = "pearson"), digits = 2)
  }
  return()
}

Или, в более общем смысле,

partcorr <- function(data, x, y, cat) {
  corrs <- list()
  for(i in levels(data[,cat])) {
    corrs[i] <- round(cor(data[data[,cat] == i, x], data[data[,cat] == i, y], method = "pearson"), digits = 2)
  }
  return()
}

Но это не работает. Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 24 января 2020
partcorr <- function(df, 
                     col1, 
                     col2, 
                     cat, 
                     digits = 2, 
                     method = "pearson", 
                     ... ) {
  dfs <- split(df[, c(col1, col2)], df[, cat])
  sapply(dfs, function(sdf) round(cor(sdf[, col1], 
                                      sdf[, col2],
                                      method = method,
                                      ...),
                                  digits = digits))
}

создает для каждой категории подкадр исходного data со столбцами, заданными для col1 и col2 - в списке фреймов данных (dfs). Затем он перебирает этот список фреймов данных и вычисляет корреляцию с данным методом между столбцами col1 и col2 подкадров. ... позволяет передавать в partcorr любые дополнительные аргументы для функции cor - он перенаправляет ее в функцию cor. Также digits можно изменить.

0 голосов
/ 24 января 2020

Вы можете использовать функцию by() и не нужны для l oop. С вашими данными и столбцами это должно работать следующим образом:

by(tv_viewing[, c("age", "views")], tv_viewing$sex, cor)

Или, поскольку у меня нет доступа к вашим данным, воспроизводимость с использованием набора данных iris выглядит следующим образом:

by(iris[, 1:2], iris$Species, cor)

Возможно, ваш код не работал, потому что вы не указали имена столбцов (tv_viewing[, sex] не будет читать пол вашего столбца, но tv_viewing[, "sex"] делает).

РЕДАКТИРОВАТЬ: Если вам нужны корреляции в одном векторе вы можете использовать этот код:

c(by(iris[, 1:2], iris$Species, function(x) cor(x)[2, 1]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...