отфильтровать несколько строк на основе содержимого одного элемента в одной строке - PullRequest
2 голосов
/ 19 июня 2019

У меня есть фрейм данных со многими строками, которые являются повторяющимися значениями, за исключением значений в столбце dd.

Если какая-либо строка содержит значение «ACT» в этом неповторяющемся столбце, мне нужно удалить все строки, которые в противном случае соответствуют этой строке «ACT», а также саму строку «ACT».Так что в примере кода я хотел бы сохранить только шесть строк, которые содержат «c» и «e» в столбце aa.

Я пробовал множество вложенных циклов if-else с for и пытался каким-то образом отфильтровать на основе значения в aa, когда «ACT» существует в dd, но не смог выяснитькак уйти от совпадения векторов в одной строке.

aa <- c("b","b","b","c","c","c","d","d","d","e","e","e")
bb <- c("t","t","t","w","w","w","r","r","r","s","s","s")
cc <- c(1,1,1,2,2,2,3,3,3,4,4,4)
dd <- c("CVR","ACT","CVR","CVR","CVR","CVR","ACT","CVR","CVR","CVR","CVR","CVR")

В идеале я ищу решение tidyverse, но, конечно, я открыт для всего.

Ответы [ 2 ]

3 голосов
/ 19 июня 2019
  • Использование пакета dplyr:
library(dplyr)
df1 <- tibble(
  aa = c("b","b","b","c","c","c","d","d","d","e","e","e"),
  bb = c("t","t","t","w","w","w","r","r","r","s","s","s"),
  cc = c(1,1,1,2,2,2,3,3,3,4,4,4),
  dd = c("CVR","ACT","CVR","CVR","CVR","CVR","ACT","CVR","CVR","CVR","CVR","CVR")
)

anti_join(df1, df1[df1$dd=="ACT", ], by=c("aa","bb","cc"))
#> # A tibble: 6 x 4
#>   aa    bb       cc dd   
#>   <chr> <chr> <dbl> <chr>
#> 1 c     w         2 CVR  
#> 2 c     w         2 CVR  
#> 3 c     w         2 CVR  
#> 4 e     s         4 CVR  
#> 5 e     s         4 CVR  
#> 6 e     s         4 CVR
  • Использование пакета data.table:
library(data.table)
df2 <- data.table(
  aa = c("b","b","b","c","c","c","d","d","d","e","e","e"),
  bb = c("t","t","t","w","w","w","r","r","r","s","s","s"),
  cc = c(1,1,1,2,2,2,3,3,3,4,4,4),
  dd = c("CVR","ACT","CVR","CVR","CVR","CVR","ACT","CVR","CVR","CVR","CVR","CVR")
)

df2[!df2[dd=="ACT",], on = c("aa","bb","bb")]
#>    aa bb cc  dd
#> 1:  c  w  2 CVR
#> 2:  c  w  2 CVR
#> 3:  c  w  2 CVR
#> 4:  e  s  4 CVR
#> 5:  e  s  4 CVR
#> 6:  e  s  4 CVR

Создано в 2019-06-19 с помощью представительного пакета (v0.3.0)

0 голосов
/ 19 июня 2019

Вы можете поместить векторы в таблицу data.table и сохранить только те группы (aa, bb, cc), которые не имеют "ACT" в столбце dd.

library(data.table)

df <- data.table(
  aa = c("b","b","b","c","c","c","d","d","d","e","e","e"),
  bb = c("t","t","t","w","w","w","r","r","r","s","s","s"),
  cc = c(1,1,1,2,2,2,3,3,3,4,4,4),
  dd = c("CVR","ACT","CVR","CVR","CVR","CVR","ACT","CVR","CVR","CVR","CVR","CVR")
)

df[, if(!"ACT" %in% dd) .SD, .(aa, bb, cc)]
#    aa bb cc  dd
# 1:  c  w  2 CVR
# 2:  c  w  2 CVR
# 3:  c  w  2 CVR
# 4:  e  s  4 CVR
# 5:  e  s  4 CVR
# 6:  e  s  4 CVR
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...