R: подсчет различных комбинаций, найденных в кадре данных, где столбцы являются взаимозаменяемыми - PullRequest
0 голосов
/ 31 мая 2018

Я не уверен, что эта проблема даже называется.Допустим, я считаю разные комбинации из двух столбцов, но я хочу, чтобы они различались по порядку двух столбцов.Вот что я имею в виду:

df = data.frame(fruit1 = c("apple", "orange", "orange", "banana", "kiwi"),
                fruit2 = c("orange", "apple", "banana", "orange", "apple"),
                stringsAsFactors = FALSE)

# What I want: total number of fruit combinations, regardless of 
# which fruit comes first and which second.
# Eg 2 apple-orange, 2 banana-orange, 1 kiwi-apple

# What I know *doesn't* work:

table(df$fruit1, df$fruit2) 

# What *does* work:
library(dplyr)
df %>% group_by(fruit1, fruit2) %>% 
  transmute(fruitA = sort(c(fruit1, fruit2))[1],
            fruitB = sort(c(fruit1, fruit2))[2]) %>%
  group_by(fruitA, fruitB) %>%
  summarise(combinations = n())

У меня есть способ сделать эту работу, как вы можете видеть, но есть ли название для этой общей проблемы?Это своего рода проблема комбинаторики, но , считая , а не , генерирующая комбинаций.А что если бы у меня было три или четыре столбца аналогичного типа?Вышеуказанный метод плохо обобщаем.Tidyverse подходит только приветствовать!

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Здесь можно использовать pmap с count

library(tidyverse)
library(rlang)
pmap_df(df, ~ sort(c(...)) %>%
                 as.list %>%
                 as_tibble %>%
                 set_names(names(df))) %>% 
    count(!!! rlang::syms(names(.)))
# A tibble: 3 x 3
#  fruit1 fruit2     n
#   <chr>  <chr>  <int>
#1 apple  kiwi       1
#2 apple  orange     2
#3 banana orange     2
0 голосов
/ 31 мая 2018

С помощью apply и sort закажите ваш фрейм данных, тогда мы просто используем group_by count

data.frame(t(apply(df,1,sort)))%>%group_by_all(.)%>%count()
# A tibble: 3 x 3
# Groups:   X1, X2 [3]
      X1     X2     n
  <fctr> <fctr> <int>
1  apple   kiwi     1
2  apple orange     2
3 banana orange     2
...