Извлечение строк из фрейма данных в зависимости от комбинации значений в двух столбцах - PullRequest
2 голосов
/ 28 апреля 2020

Я получил фрейм данных

a <- c('A','A','A','A','B','B','C','C')
b <- c(1,2,1,3,1,3,1,6)
c <- c('K','K','H','H','K','K','H','H')

frame <- data.frame(a,b,c)

> frame
  a b c
1 A 1 K
2 A 2 K
3 A 1 H
4 A 3 H
5 B 1 K
6 B 3 K
7 C 1 H
8 C 6 H

И теперь я хочу извлечь данные следующим образом: Если строка в «a» встречается в строке с «K» И в строке с «H» ', строки с буквой' K 'будут пропущены. В конце концов это должно выглядеть так:

> frame
  a b c
1 A 1 H
2 A 3 H
3 B 1 K
4 B 3 K
5 C 1 H
6 C 6 H

Может быть, у вас есть какие-либо идеи. Спасибо!

Ответы [ 2 ]

3 голосов
/ 28 апреля 2020

Вы можете использовать intersect, чтобы найти строки в a, имеющие H и K в столбце c, а затем извлечь те, в которых столбец c содержит K.

frame[!(frame$a %in% intersect(frame$a[frame$c=="K"],
   frame$a[frame$c=="H"]) & frame$c=="K"),]
#  a b c
#3 A 1 H
#4 A 3 H
#5 B 1 K
#6 B 3 K
#7 C 1 H
#8 C 6 H
1 голос
/ 28 апреля 2020

Мы могли бы использовать группу по filter

library(dplyr)
frame %>%
    group_by(a) %>%
    filter(all(c('K', 'H') %in% c) & c != 'K'|n_distinct(c) == 1)
# A tibble: 6 x 3
# Groups:   a [3]
#  a         b c    
#  <fct> <dbl> <fct>
#1 A         1 H    
#2 A         3 H    
#3 B         1 K    
#4 B         3 K    
#5 C         1 H    
#6 C         6 H    
...