计算数据框中列之间的组合

时间:2018-06-07 09:38:12

标签: r dataframe combinations

我有一个像这样的数据框

   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)喜欢&#34; AB&#34;和&#34; BA&#34;作为相同的组合。 最终的数据框应如下所示。

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 :(得分:0)

您可以尝试使用此tidyverse解决方案。 首先使用包括mapunitesortpaste在内的一些神奇且不那么优雅的代码计算所有可能的18个组合,考虑AB == BA两个变量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