Удалить строку с указанным c числом в R - PullRequest
0 голосов
/ 18 июня 2020

Я хочу удалить строку с тестом «student2». Однако я не хочу удалять такие строки, как «student22», «student 23» ... et c. Например:

       Student.Code Values
1  canada.student12      2 
2   canada.student2      3 # remove
3  canada.student23      5 # keep
4       US.student2      6 # remove
5     US.student32       2
6    Aus.student87     645
7 Turkey.student25       4 #keep

Я использовал код grepl("student2", example$Student.code, fixed = TRUE, но он также находит (удаляет) строки, похожие на «student23»

Ответы [ 3 ]

3 голосов
/ 18 июня 2020

Данные:

df <- data.frame(
  Student = c("canada.student12", "canada.student2", "canada.student23","US.student2", "US.student32", "Aus.student87", "Turkey.student25"),
  Value = c(2,3,5,6,2,654,5)
)

Решение: (в базе R)

Идея состоит в том, чтобы использовать grepl для сопоставления тех значений, где число 2 встречается на границе слова , то есть в регулярном выражении по адресу \\b, и для исключения этих строк с помощью отрицателя !:

df[!grepl("student2\\b", df$Student),]
           Student Value
1 canada.student12     2
3 canada.student23     5
5     US.student32     2
6    Aus.student87   654
7 Turkey.student25     5

В качестве альтернативы вы также можете go наоборот и сопоставить те шаблоны, которые вы хотите сохранить:

df[grepl("student(?=\\d{2,})", df$Student, perl = T),]

Здесь идея состоит в том, чтобы использовать положительный просмотр вперед для сопоставления значений с student iff , за ними сразу следует как минимум два цифры (\\d{2,}). (Обратите внимание, что при использовании просмотра вперед или назад необходимо включить perl = T.)

3 голосов
/ 18 июня 2020

Мы можем использовать grepl("student2$", example$Student.Code)

library(tidyverse)
example <- tibble::tribble(
             ~Student.Code, ~Values,
        "canada.student12",      2L,
         "canada.student2",      3L,
        "canada.student23",      5L,
             "US.student2",      6L,
            "US.student32",      2L,
           "Aus.student87",    645L,
        "Turkey.student25",      4L
        )

example$Student.Code
grepl("student2$", example$Student.Code)
[1] FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE

example %>% 
  filter(!grepl("student2$", Student.Code))

# A tibble: 5 x 2
  Student.Code     Values
  <chr>             <int>
1 canada.student12      2
2 canada.student23      5
3 US.student32          2
4 Aus.student87       645
5 Turkey.student25      4
0 голосов
/ 19 июня 2020

Если у вас есть переменная с точным значением, которое вы хотите удалить, не используйте grep или grepl.

example <- tibble::tribble(
             ~Student.Code, ~Values,
        "canada.student12",      2L,
         "canada.student2",      3L,
        "canada.student23",      5L,
             "US.student2",      6L,
            "US.student32",      2L,
           "Aus.student87",    645L,
        "Turkey.student25",      4L
        )

example <- example[example$Student.Code != "canada.student2",]
# or, in dplyr
example <- filter(example, Student.Code != "canada.student2")
# for multiple values
example <- filter(example, !(Student.Code %in% c("canada.student2", "US.student2")))

fixed = TRUE не работает, потому что все это означает «поиск этой точной строки во входных строках», а не «только соответствие этой точной строке (это должно быть все значение)»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...