Изменение формы длинного кадра данных на матрицу корреляции в R - PullRequest
0 голосов
/ 20 марта 2019

У меня есть таблица с тремя столбцами, содержащей мою первую переменную, вторую переменную и их оценочную корреляцию (оценки, полученные из модели brmsfit).

В качестве примера давайте рассмотрим следующую таблицу:

tibble::tribble(
     ~a,    ~b,                     ~est,
  "fro", "fcr",   "0.061 [-0.276, 0.38]",
  "fro", "nek",  "0.115 [-0.218, 0.421]",
  "nek", "fcr",  "0.154 [-0.169, 0.476]",
  "ooi", "fcr", "-0.022 [-0.352, 0.305]",
  "ooi", "fro",  "0.006 [-0.326, 0.323]",
  "ooi", "nek",  "0.173 [-0.151, 0.486]",
  "ooi", "zyg",   "0.039 [-0.29, 0.362]",
  "zyg", "fcr",  "-0.02 [-0.347, 0.317]",
  "zyg", "fro",  "0.092 [-0.245, 0.406]",
  "zyg", "nek",   "0.315 [0.011, 0.613]"
  )

Я хотел бы изменить его в форме корреляционной матрицы.Я знаю, что некоторые пакеты позволяют выполнять точную обратную операцию (например, функцию corrr::stretch()), но я не знаю простого решения для преобразования широкого фрейма данных в матрицу корреляции.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Это то, что вы ищете?

library(tidyverse)
library(magrittr)

df %$%
  c(a, b) %>%
  crossing(a = ., b = .) %>%
  left_join(df) %>%
  mutate(est = if_else(a == b, '1', est)) %>%
  group_by(a) %>%
  mutate(rn = row_number() %>% rev()) %>%
  nest() %>%
  mutate(gn = row_number() %>% rev()) %>%
  unnest() %>%
  mutate(
    cond = gn > rn,
    a_temp = a,
    a = if_else(cond, b, a),
    b = if_else(cond, a_temp, b)
  ) %>%
  select(a, b, est) %>%
  filter(!is.na(est)) %>%
  spread(a, est)

Выход:

  b     fcr   fro                  nek                   ooi                    zyg                  
  <chr> <chr> <chr>                <chr>                 <chr>                  <chr>                
1 fcr   1     0.061 [-0.276, 0.38] 0.154 [-0.169, 0.476] -0.022 [-0.352, 0.305] -0.02 [-0.347, 0.317]
2 fro   NA    1                    0.115 [-0.218, 0.421] 0.006 [-0.326, 0.323]  0.092 [-0.245, 0.406]
3 nek   NA    NA                   1                     0.173 [-0.151, 0.486]  0.315 [0.011, 0.613] 
4 ooi   NA    NA                   NA                    1                      0.039 [-0.29, 0.362] 
5 zyg   NA    NA                   NA                    NA                     1                    
0 голосов
/ 20 марта 2019

Решение с использованием tidyverse. dat2 - окончательный вывод с первым столбцом в качестве имени переменной. Заголовок столбца для других столбцов также является именами переменных.

library(tidyverse)

dat <- tibble::tribble(
  ~a,    ~b,                     ~est,
  "fro", "fcr",   "0.061 [-0.276, 0.38]",
  "fro", "nek",  "0.115 [-0.218, 0.421]",
  "nek", "fcr",  "0.154 [-0.169, 0.476]",
  "ooi", "fcr", "-0.022 [-0.352, 0.305]",
  "ooi", "fro",  "0.006 [-0.326, 0.323]",
  "ooi", "nek",  "0.173 [-0.151, 0.486]",
  "ooi", "zyg",   "0.039 [-0.29, 0.362]",
  "zyg", "fcr",  "-0.02 [-0.347, 0.317]",
  "zyg", "fro",  "0.092 [-0.245, 0.406]",
  "zyg", "nek",   "0.315 [0.011, 0.613]"
)

dat2 <- dat %>%
  separate(est, into = c("est", "range"), sep = 6, convert = TRUE) %>%
  select(-range) %>%
  spread(b, est)
dat2
# # A tibble: 4 x 5
#   a        fcr    fro    nek    zyg
#   <chr>  <dbl>  <dbl>  <dbl>  <dbl>
# 1 fro    0.061 NA      0.115 NA    
# 2 nek    0.154 NA     NA     NA    
# 3 ooi   -0.022  0.006  0.173  0.039
# 4 zyg   -0.02   0.092  0.315 NA    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...