Фильтр, если в группе существуют определенные строковые значения - PullRequest
0 голосов
/ 09 мая 2018

Это кажется очень простым, но каким-то образом не может понять, как справиться с этим. Как лучше всего определить, есть ли в группе два значения в виде чередующейся строки в другом столбце.

Пример df:

library(tidyverse)

tribble(
  ~city, ~var,
  "A", "PVDA",
  "A", "GL",
  "A", "GMBL",
  "B", "GL",
  "B", "VVD",
  "C", "CDA",
  "C", "VVD"
)

я хочу сделать что-то вроде этого:

join_anp_vgn_sf %>%
  group_by(city) %>%
  filter(grepl("^PVDA$&^GL$", var))

Но это не работает, потому что этот код просматривает каждое отдельное значение.

Желаемый вывод:

  city  var  
  <chr> <chr>
1 A     PVDA 
2 A     GL
3 A     GMBL 

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Использование dplyr

df <- tribble(
  ~city, ~var,
  "A", "PVDA",
  "A", "GL",
  "B", "GL",
  "B", "VVD",
  "C", "CDA",
  "C", "VVD"
)

df %>% 
  group_by(city) %>% 
  filter(all(c("PVDA","GL") %in% var))

# A tibble: 2 x 2
# Groups:   city [1]
#   city  var  
#   <chr> <chr>
# 1 A     PVDA 
# 2 A     GL   

Редактировать

С обновленным примером

df <- tribble(
  ~city, ~var,
  "A", "PVDA",
  "A", "GL",
  "A", "GMBL",
  "B", "GL",
  "B", "VVD",
  "C", "CDA",
  "C", "VVD"
)

df %>% 
  group_by(city) %>% 
  filter(all(c("PVDA","GL") %in% var))

# A tibble: 3 x 2
# Groups:   city [1]
#   city  var  
#   <chr> <chr>
# 1 A     PVDA 
# 2 A     GL   
# 3 A     GMBL 
0 голосов
/ 09 мая 2018

Вы все еще можете использовать grepl, если хотите, поэтому вы можете использовать частичное совпадение строк:

Dplyr:

df %>%
  group_by(city) %>%
  filter(sum(grepl("PVDA|GL", unique(var))) >= 2)

# A tibble: 2 x 2
# Groups:   city [1]
#   city   var
#  <chr> <chr>
#1     A  PVDA
#2     A    GL

Base R:

df[ave(df$var, df$city, FUN = function(x) sum(grepl("PVDA|GL", unique(x))) >= 2) %>% as.logical, ]
0 голосов
/ 09 мая 2018

Используйте функцию grepl, чтобы найти город с обоими значениями PVDA и GL, после чего выберите все значения в исходном трибл.

PVDA<-as.character(unlist(df[grepl("^PVDA", df$var),"city"]))
GL<-as.character(unlist(df[grepl("^GL", df$var),"city"]))

df[df$city==PVDA[PVDA %in% GL],]
# A tibble: 2 x 2
  city  var  
  <chr> <chr>
1 A     PVDA 
2 A     GL 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...