Это можно сделать с большим количеством тидыр:
library(tidyverse)
df <- data.frame(colA = c(1L, 1L, 4L, 2L, 3L, 3L),
colB = c("a", "b", "b", "a", "a", "b"),
colC = c(1L, 2L, 2L, 3L, 2L, 1L),
colD = c(2L, 3L, 4L, 1L, 6L, 6L))
df %>%
gather(key, value, colA) %>%
unite(colA, key, value) %>%
gather(key, value, -colA) %>%
unite(col, key, value) %>%
count(colA, col) %>%
spread(colA, n, fill = 0)
#> Warning: attributes are not identical across measure variables;
#> they will be dropped
#> # A tibble: 10 x 5
#> col colA_1 colA_2 colA_3 colA_4
#> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 colB_a 1 1 1 0
#> 2 colB_b 1 0 1 1
#> 3 colC_1 1 0 1 0
#> 4 colC_2 1 0 1 1
#> 5 colC_3 0 1 0 0
#> 6 colD_1 0 1 0 0
#> 7 colD_2 1 0 0 0
#> 8 colD_3 1 0 0 0
#> 9 colD_4 0 0 0 1
#> 10 colD_6 0 0 2 0