Одна tidyverse
возможность может быть:
df %>%
gather(var, letters, -id, na.rm = TRUE) %>%
add_count(var, letters, name = "n_letters") %>%
add_count(var, name = "n_all") %>%
select(-id) %>%
distinct()
var letters n_letters n_all
<chr> <chr> <int> <int>
1 col1 b 1 2
2 col1 a 1 2
3 col2 b 2 2
4 col3 a 1 1
Или:
df %>%
gather(var, letters, -id, na.rm = TRUE) %>%
add_count(var, letters, name = "n_letters") %>%
add_count(var, name = "all") %>%
select(-id) %>%
distinct() %>%
spread(letters, n_letters, fill = 0)
var all a b
<chr> <int> <dbl> <dbl>
1 col1 2 1 1
2 col2 2 0 2
3 col3 1 1 0