Для данной комбинации во фрейме данных вычислите частоту появления этой комбинации в другом фрейме данных в R

#r #dplyr #frequency

#r #dplyr #частота

Вопрос:

У меня есть фрейм данных, который имеет различные комбинации следующим образом:

     structure(list(`Q1` = c(0, 0, 0, 1, 0, 0, 0, 0, 0, 0), `Q2` = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0), `Q3` = c(0, 1, 0, 0, 0, 1, 1, 0, 0, 
0), `Q4` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `Q5` = c(0, 0, 1, 0, 
0, 1, 0, 1, 1, 0), `Q6` = c(1, 1, 0, 1, 1, 0, 0, 1, 1, 1), `Q7` = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0), `Q8` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
1), `Q9` = c(1, 0, 1, 0, 0, 1, 1, 0, 1, 0), `Q10` = c(0, 0, 0, 
0, 0, 0, 0, 0, 0, 0), `Q11` = c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0), 
    `Q12` = c(1, 1, 1, 1, 1, 0, 1, 1, 0, 1)), row.names = c(NA, 
-10L), class = "data.frame")
 

У меня есть базовый фрейм данных, в котором у меня разные комбинации с весом для каждой комбинации.

 structure(list(Q1 = c(0, 0, 0, 0, 0, 1, 0, 0, 0, 1), Q2 = c(0, 
1, 1, 0, 0, 0, 0, 0, 0, 0), Q3 = c(1, 0, 0, 1, 0, 0, 0, 0, 0, 
0), Q4 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Q5 = c(1, 0, 1, 0, 
0, 0, 1, 0, 0, 1), Q6 = c(1, 1, 1, 0, 1, 0, 0, 1, 0, 1), Q7 = c(0, 
0, 1, 1, 1, 0, 0, 0, 0, 0), Q8 = c(1, 0, 1, 0, 0, 1, 0, 0, 0, 
0), Q9 = c(1, 0, 0, 0, 0, 0, 0, 1, 1, 0), Q10 = c(0, 0, 1, 0, 
0, 1, 0, 0, 0, 0), Q11 = c(0, 0, 1, 0, 0, 1, 0, 0, 0, 0), Q12 = c(1, 
0, 0, 0, 1, 0, 1, 0, 0, 0), RatingBinary = c(1, 1, 0, 1, 0, 1, 
0, 1, 1, 1)), row.names = c(NA, 10L), class = "data.frame")
 

Постановка задачи заключается в том, что для каждой комбинации 1 в 1-м фрейме данных (т.Е. Q6, Q9, Q12 в 1-й строке, Q3, Q6, Q12 во 2-й строке) мне нужно получить количество строк, которые удовлетворяются в базовом фрейме данных.

Например: в комбинированном фрейме данных (1-й Df) в 1-й строке Q6, Q9 и Q12 имеют двоичное значение 1 . Мне нужно получить количество этой комбинации (Q6, Q9 и Q12, которые имеют 1) в базовых данных и получить количество строк, имеющих RatingBinary значения 0 и 1.

Как я могу реализовать это в R? Может ли кто-нибудь предложить подходящее решение для этого сценария?

Комментарии:

1. Вы что-нибудь пробовали? Каков ваш ожидаемый результат для заданных данных?

2. Путем «подсчета этого combination…in базовые данные», вы имеете в виду, что хотите найти все экземпляры в базовых данных, где Q6, Q9 и Q12 равны 1, а затем где Q3, Q6, Q12 равны 1 и так далее. Затем, используя «получить количество строк …», вы хотите суммировать, сколько строк имеют RatingBinary = 0 и сколько строк имеют 1 для каждого набора (определите набор как 1) Q6, Q9, Q12; 2) Q3, Q6, Q12 и т.д.)?

3. @latlio — Да, точно!

4. @Ronak Shah — Не могли бы вы взглянуть на комментарий latlio? Это ожидаемый результат

Ответ №1:

Вот алгоритмический подход.

Давайте назовем набор в первом фрейме данных комбинированным набором; это набор из трех вопросов в заданной строке. Давайте также назовем набор в базовых данных базовым набором; это набор в заданной строке, для которого мы пытаемся определить, является ли данный комбинированный набор частью.

Подход, по сути, заключается в переборе каждого комбинированного набора и поиске совпадений по всем базовым наборам. Наборы, похоже, состоят только из трех, поэтому я пользуюсь этим, жестко кодируя a sum == 3 , а не выполняя независимое совпадение. Мы храним совпадения в структуре, которую я вызываю pair . Совпадение обозначается символом 1 . Я определяю пару (x, y), где x — номер строки комбинированного набора данных, а y — номер строки базового набора данных.

 pair <- matrix(nrow = 10, ncol = 10)
for(i in 1:nrow(df)) {
  ind <- which(df[i,] == 1)
  for(j in 1:nrow(df2)) {
    if(sum(df2[j, ind]) == 3){
      pair[i,j] <- 1
    } else {
      pair[i,j] <- 0
    }
  }
}
 

Объект pair является:

       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1    0    0    0    0    0    0    0    0     0
 [2,]    1    0    0    0    0    0    0    0    0     0
 [3,]    1    0    0    0    0    0    0    0    0     0
 [4,]    0    0    0    0    0    0    0    0    0     0
 [5,]    0    0    0    0    0    0    0    0    0     0
 [6,]    1    0    0    0    0    0    0    0    0     0
 [7,]    1    0    0    0    0    0    0    0    0     0
 [8,]    1    0    0    0    0    0    0    0    0     0
 [9,]    1    0    0    0    0    0    0    0    0     0
[10,]    1    0    0    0    0    0    0    0    0     0
 

Это означает, что только для первого комбинированного набора мы нашли совпадения во всех базовых наборах, за исключением базового набора 4 и базового набора 5. Поскольку существует только одно совпадение, ответ на ваш второй вопрос о количестве строк, имеющих RatingBinary 0 или 1, становится тривиальным — это просто RatingBinary для этой строки / базового набора в базовом наборе данных.