Как посчитать количество общих ценностей в определенной группе? - PullRequest
2 голосов
/ 05 августа 2020

У меня есть фрейм данных df.

df <- data.frame(shop = c("A", "A", "A", "B", "B", "B", "C", "C", "C"),
                 product = c(1,2,3,4,5,1,5,2,4))

Для каждой пары магазинов, т.е. AB, AC и BC, я использую sh, чтобы подсчитать количество общих product.

Ожидаемый результат:

pair common_product
AB   1        # Because 1 is common
AC   1        # Because 2 is common
BC   2        # Because 5 and 4 is common

Ответы [ 3 ]

4 голосов
/ 05 августа 2020

Базовый вариант R будет:

pair <- combn(unique(df$shop), 2, paste0, collapse = "")
commmon_product <- combn(unique(df$shop), 2, function(x) 
      with(df, length(intersect(product[shop == x[1]], product[shop == x[2]]))))

data.frame(pair, commmon_product)
#  pair commmon_product
#1   AB               1
#2   AC               1
#3   BC               2

Для каждой комбинации shop значений мы узнаем, сколько product intersect, используя combn.

0 голосов
/ 05 августа 2020
M1=matrix(0,length(unique(df$shop)),5)
for(i in 1:length(unique(df$shop))){
  M1[i,1]="A"
  M1[i,2]=dim(d[(df$shop)=="A",])[1]
  M1[i,3]=unique(df$shop)[i]
  M1[i,4]=dim(df[df$shop==unique(d$V1)[i],])[1]
  M1[i,5]=sum(df[(df$shop)=="A",2] %in% df[df$shop==unique(df$shop)[i],2])
}

Вернет больше, чем вы хотите. Подсчитывает количество объектов в «A», «B» и «C»

0 голосов
/ 05 августа 2020

используйте tidyverse

df %>% 
  group_by(product) %>% 
  summarise(pair = str_c(shop, collapse = "")) %>% 
  count(pair)

# A tibble: 4 x 2
  pair      n
  <chr> <int>
1 A         1
2 AB        1
3 AC        1
4 BC        2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...