Подсчет комбинаций между столбцами во фрейме данных - PullRequest
0 голосов
/ 07 июня 2018

У меня есть такой фрейм данных

   V1 V2 V3
1  A  A  A
2  B  A  A
3  A  B  C
4  C  A  A

С этим кодом я получаю еще один фрейм данных со всеми возможными комбинациями с "A", "B", "C".

library("gtools")
vars <- c("A", "B", "C")
combMatrix <- (combinations(n = 3, r = 2, repeats.allowed = T, v = vars))
combArray <- paste(combMatrix [,1], combMatrix [,2], sep="")
combDf <- expand.grid(combArray ,vars)

Затем я хочу посчитать комбинации между парой из двух столбцов в первом кадре данных (скажем, V1 и V2) и другом столбце, и важно рассмотреть связанные символы (в данном случае V1 + V2) как «AB"и" БА "как одна и та же комбинация.Конечный фрейм данных должен выглядеть следующим образом.

V1+V2 V3 Freq
AA    A  1
AB    A  1
AC    A  1
BB    A  0
BC    A  0
CC    A  0
AA    B  0
AB    B  0
AC    B  0
BB    B  0
BC    B  0
CC    B  0
AA    C  0
AB    C  1   
AC    C  0
BB    C  0
BC    C  0
CC    C  0

Затем я должен повторить процесс для каждой комбинации столбцов (V1 + V2 / V3, V1 + V3 / V2, V2 + V3 / V1).

1 Ответ

0 голосов
/ 07 июня 2018

Вы можете попробовать это tidyverse решение.Сначала рассчитайте все 18 возможных комбинаций с учетом AB == BA для двух переменных, используя магический и не очень элегантный код, включая map, unite, sort и paste вместе с rowwise.

library(tidyverse)
all_combs <- expand.grid(unique(unlist(d)),unique(unlist(d)),unique(unlist(d))) %>% 
  rowwise() %>% 
  mutate_all(as.character) %>% 
  mutate(two=paste(sort(c(Var1,Var2)), collapse="")) %>% 
  ungroup() %>% 
  unite(all, two, Var3) %>% 
  select(all) %>% 
  distinct()

Тогда остальные

combn(1:ncol(d),2, simplify = F) %>% 
  set_names(map(.,~paste(., collapse = "&"))) %>% 
  map(~select(d,a =.[1], b=.[2], everything()) %>% 
        rowwise() %>% 
        mutate_all(as.character) %>% 
        mutate(two=paste(sort(c(a, b)), collapse="")) %>% 
        select(two, contains("V"), -a,-b) %>% 
        ungroup() %>% 
        unite(all, two, contains("V")) %>% 
        count(all)) %>% 
  map(~right_join(.,all_combs, by="all")) %>% 
  bind_rows(.id = "id") %>% 
  mutate(n=ifelse(is.na(n), 0, n)) %>% 
  spread(id, n)
# A tibble: 18 x 4
   all    `1&2`  `1&3`  `2&3`
   <chr>  <dbl>  <dbl>  <dbl>
 1 AA_A       1      1      1
 2 AA_B       0      0      1
 3 AA_C       0      0      1
 4 AB_A       1      1      0
 5 AB_B       0      0      0
 6 AB_C       1      0      0
 7 AC_A       1      1      0
 8 AC_B       0      1      0
 9 AC_C       0      0      0
10 BB_A       0      0      0
11 BB_B       0      0      0
12 BB_C       0      0      0
13 BC_A       0      0      1
14 BC_B       0      0      0
15 BC_C       0      0      0
16 CC_A       0      0      0
17 CC_B       0      0      0
18 CC_C       0      0      0
...