вернуть только количество строк, которые соответствуют нескольким критериям одновременно в r - PullRequest
1 голос
/ 03 февраля 2020

Я ссылаюсь на уже отвеченный вопрос, который максимально приблизил меня: сопоставить / найти строки на основе нескольких требуемых значений в одной строке в R

Пример кадра данных:

test <- data.frame(grp=c(1,1,2,2,2,3,3,3,4,4,4,4,4),val=c("C","I","E","I","C","E","I","A","C","I","E","E","A"))

Я изменил ответ, чтобы он возвращал только значения GRP, соответствующие всем критериям.

library('dplyr')
test %>%
  group_by(grp) %>%
  summarise(matching = all(c("A", "I", "C") %in% val)) %>% filter(matching ==TRUE)

Здесь мне нужно просто вернуть количество GRPS, которые соответствуют критериям, так как одно числовое значение, которое можно вставить в одну ячейку отдельного кадра данных. Я пытаюсь найти совпадения для нескольких различных наборов критериев для одного и того же data.frame. (например, количество групп, которые соответствуют критериям AI и C; количество групп, которые соответствуют критериям E, A и I; количество групп, которые соответствуют критериям A, I и E; (et c.) )

В этом примере возвращается тиббл:

A tibble: 1 x 2
    grp matching
  <dbl> <lgl>   
1     4 TRUE

Таким образом, существует один «grp», который соответствует определенному критерию. Мне нужно вернуть это число: 1.

, если моим критерием является только буква I, тогда я бы хотел, чтобы код возвращал число 4 , как и все группы (1, 2, 3 и 4) соответствуют букве I.

Если моим критерием является буква A, то я бы хотел, чтобы код возвращал число 2 , поскольку совпадают только группы 3 и 4 на букву А

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

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

criteria = c('A','I','C')
return = subset(test,test$val %in% criteria)
count = 0

for(group in unique(return$grp))
{
  criteriaSum =  sum(criteria %in% unique(return$val[return$grp == group]))
  if(criteriaSum == length(criteria))
    count = count + 1
}
0 голосов
/ 03 февраля 2020

Если мы ищем различные значения combn от 'val' до filter, используйте combn для возврата комбинаций 'val', взятых m = 3 за один раз, сгруппированных по 'grp', filter строки 'test', где all комбинаций присутствуют в 'val', summarise от paste с sort ed unique значениями 'val' и связывают list с один data.frame с bind_rows

library(dplyr)
combn(levels(test$val), 3, simplify = FALSE,
     FUN = function(x)
      test %>%
         group_by(grp) %>%
         filter(all(x  %in% val)) %>% 
         summarise(out = toString(sort(unique(val))))) %>% 
  bind_rows

Update

Если мы просто хотим получить одну строку как TRUE, после filter с использованием 'grp' на основе условия, summarise, создав matching как ИСТИНА

test %>%
     group_by(grp) %>%
     filter(all(c("A", "I", "C") %in% val)) %>%
     summarise(matching = TRUE)
# A tibble: 1 x 2
#    grp matching
#  <dbl> <lgl>   
#1     4 TRUE  

Или переключите summarise и filter шагов

test %>% 
   group_by(grp) %>% 
   summarise(matching = all(c("A", "I", "C") %in% val)) %>% 
   filter(matching)  %>%
   pull(matching) %>%
   sum 
#[1] 1

Или можно сделать более компактными

test %>% 
    group_by(grp) %>%
    summarise(matching = all(c("A", "I", "C") %in% val)) %>% 
    pull(matching) %>% 
    sum
 #[1] 1

или используя base R

sum(!rowSums(table(test) == 0))
#[1] 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...