#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
для этой строки / базового набора в базовом наборе данных.