Используйте внешний список для удаления данных из строк - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть фрейм данных

df <- data.frame(
    A = c(4, 2, 7),
    B = c(3, 3, 5),
    C = c("Expert,Foo", "Bar,Wild", "Zap")
  )

и второй, который я хотел бы использовать в качестве индекса для удаления строк, содержащих конкретные значения

mylist <- data.frame(rtext = c("Foo","Bar"))

Поэтому я попробовал это:

subset(df, C %in% mylist$rtext)

Как удалить определенные строки?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

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

df[!stringr::str_detect(df$C,paste(mylist$rtext,collapse = '|')),]
  A B   C
3 7 5 Zap

Если вам нужно совпадение 100%, что означает, что Foooo не будет удалено, проверьте с помощью dplyr и tidyr переформатированиеваш df 1-й, так как str_detect и grepl являются частичным совпадением, если у вас есть слово, подобное Expert,Foott, оно все равно будет отображаться как совпадение с Foo

library(tidyr)
library(dplyr)
df$id=seq.int(nrow(df))
df1=df %>%
        transform(C = strsplit(C, ",")) %>%
        unnest(C)

df[!df$id%in%df1$id[df1$C%in%mylist$rtext],]
0 голосов
/ 11 февраля 2019

Поскольку это частичное совпадение, мы можем использовать grep.Мы paste элементы столбца 'myList' rtext 'в одну строку с разделителем |, что подразумевает OR, затем получаем логический индекс с grepl для столбца' C 'в' df ', отрицание(!), чтобы изменить значение ИСТИНА на ЛОЖЬ и ЛОЖЬ на ИСТИНА на subset строки, которые не входят в 'rtext' 'mylist'

subset(df, !grepl(paste(mylist$rtext, collapse="|"), C))
#   A B   C
#3 7 5 Zap
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...