Подмножество строк в кадре данных R на основе частичного совпадения нескольких строк - PullRequest
1 голос
/ 30 октября 2019

Я не думаю, что этот точный вопрос был задан - много вещей о поднаборах, основанных на одном значении (то есть x[grepl("some string", x[["column1"]]),]), но не на нескольких значениях / строках.

Вот примермои данные:

#create sample data frame
data = data.frame(id = c(1,2,3,4), phrase = c("dog, frog, cat, moose", "horse, bunny, mouse", "armadillo, cat, bird,", "monkey, chimp, cow"))

#convert the `phrase` column to character string (the dataset I'm working on requires this)
data$phrase = data$phrase

#list of strings to remove rows by
remove_if = c("dog", "cat")

Это даст набор данных, который выглядит следующим образом:

  id                phrase
1  1 dog, frog, cat, moose
2  2   horse, bunny, mouse
3  3 armadillo, cat, bird,
4  4    monkey, chimp, cow

Я хочу удалить строку 1 и строку 3 (потому что строка 1 содержит «собаку» и строку 3содержит «cat»), но оставьте строку 2 и строку 4.

  id                phrase
1  2   horse, bunny, mouse
2  4    monkey, chimp, cow

Другими словами, я хочу задать подмножество data так, чтобы это были только (заголовки и) строка 2 и строка 4 (потому что они не содержат ни «собака», ни «кошка»).

Спасибо!

Ответы [ 5 ]

1 голос
/ 30 октября 2019

Если вы хотите смешать его с dplyr и stringr:

library(stringr)
library(dplyr)

data %>%
  filter(str_detect(phrase, paste(remove_if, collapse = "|"), negate = TRUE))
#   id              phrase
# 1  2 horse, bunny, mouse
# 2  4  monkey, chimp, cow
1 голос
/ 30 октября 2019
data[!grepl(paste0("(^|, )(", paste0(remove_if, collapse = "|"), ")(,|$)"), data$phrase),]

# id                    phrase
#  2 caterpillar, bunny, mouse
#  4        monkey, chimp, cow

регулярное выражение, построенное в этом примере, равно "(^|, )(dog|cat)(,|$)", чтобы избежать совпадения слов, которые содержат слова «кошка» или «собака», но на самом деле не являются точными словами, например «гусеница»

1 голос
/ 30 октября 2019

Мы можем использовать grepl с subset после paste, вставляя 'remove_if' в одну строку

subset(data, !grepl(paste(remove_if, collapse="|"), phrase))
#    id              phrase
#2  2 horse, bunny, mouse
#4  4  monkey, chimp, cow
1 голос
/ 30 октября 2019

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

> data[grep(paste0(remove_if, collapse = "|"), data$phrase, invert = TRUE), ]
  id              phrase
2  2 horse, bunny, mouse
4  4  monkey, chimp, cow
0 голосов
/ 30 октября 2019

Другой способ (возможно, не самый лучший):

data[-unique(unlist(sapply(c(remove_if),function(x){grep(x,data$phrase)}))),]
  id              phrase
2  2 horse, bunny, mouse
4  4  monkey, chimp, cow
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...