Как отфильтровать строку на основе строки, но только если строка встречается несколько раз - PullRequest
0 голосов
/ 04 августа 2020

Я работаю над очисткой набора данных. Пример набора ниже. Как видите, первая запись имеет несколько вхождений vs. Я хочу отфильтровать любые строки, которые имеют несколько вхождений, так как мне просто нужны совпадения между двумя борцами.

2008-03-29 KO-D Openweight Title Number 1 Contendership Four Way Dance: Great Yago (Yoshiaki Yago) vs. I Am Chono Sanshiro (Sanshiro Takagi) vs. Koo vs. Seiya Morohashi - No Contest
1935-04-17  Lou Thesz Vs. Otto Kuss Ime Limit Draw 
1976-05-09  Harley Race Vs. The Destroyer Ime Limit Draw 

Я пробую следующее, но не работает. Я не уверен, что еще мне следует попробовать.

dataset_final <- dataset %>%
filter(
!str_detect(match, "( vs. | Vs. ){2,}")
)

Любые идеи о том, как реализовать sh этот фильтр, были бы признательны. Спасибо!

Ответы [ 2 ]

1 голос
/ 04 августа 2020
В пакете

stringr есть функция str_count, которую можно использовать

dataset <- structure(list(date = c("2008-03-29", "1935-04-17", "1976-05-09"
), str = c("KO-D Openweight Title Number 1 Contendership Four Way Dance: Great Yago (Yoshiaki Yago) vs. I Am Chono Sanshiro (Sanshiro Takagi) vs. Koo vs. Seiya Morohashi - No Contest",
"Lou Thesz Vs. Otto Kuss Ime Limit Draw", "Harley Race Vs. The Destroyer Ime Limit Draw"
)), class = "data.frame", row.names = c(NA, -3L))


library(stringr)
library(tidyverse)

dataset %>% 
mutate(str_low = tolower(str)) %>% filter(str_count(str_low, 'vs.') < 2) %>% 
select(date, str)
0 голосов
/ 04 августа 2020

Это разбивает строки на vs., а затем подсчитывает длину. Это возвращает первую строку с датой 2008-03-29

df1$count <- lengths(strsplit(df1$V2, 'vs.'))
df1[df1$count > 1, ]

Фильтр за один проход

df1[lengths(strsplit(df1$V2, 'vs.')) > 1, ]

Тестовые данные

df1 <- structure(list(V1 = c("2008-03-29", "1935-04-17", "1976-05-09"
), V2 = c("KO-D Openweight Title Number 1 Contendership Four Way Dance: Great Yago 
(Yoshiaki Yago) vs. I Am Chono Sanshiro (Sanshiro Takagi) vs. Koo vs. Seiya Morohashi 
- No Contest", 
"Lou Thesz Vs. Otto Kuss Ime Limit Draw ", "Harley Race Vs. The Destroyer Ime Limit Draw "
), count = c(4L, 1L, 1L)), row.names = c(NA, -3L), class = "data.frame")
...