Фильтр со списком строковых условий

Вот пример того, как выглядят данные:

height <- c("T_0.1", "T_0.2", "T_0.3", "T_0.11", "T_0.12", "T_0.13", "T_10.1", "T_10.2",  
"T_10.3", "T_10.11", "T_10.12", "T_10.13","T_36.1", "T_36.2", "T_36.3", "T_36.11", "T_36.12", 
"T_36.13")
value <- c(1,12,14,15,20,22,5,9,4,0.0,0.45,0.7,1,2,7,100,9,45)

df <- data.frame(height,value)

Я хочу отфильтровать все значения высоты, которые заканчиваются на «.1», «.2» и «.3». Однако я хочу сделать это, используя «список шаблонов», потому что фактический фрейм данных имеет более 1000 значений.

Вот что я пробовал:

vars_list <- c(".1", ".2",".3")

df_new<-df[grepl(paste(vars_list, collapse = "|"), df$height),]

matchPattern <- paste(vars_list, collapse = "|")
df_new <- df %>% select(matches(matchPattern))

Оба кода возвращают 0 наблюдений. Я не уверен, в чем проблема, и я не смог найти сообщение, которое могло бы помочь. Так что любая помощь очень ценится!

Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел &quot;Заголовок&quot; в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
0
0
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Точка — это метасимвол регулярного выражения , который соответствует любому символу, кроме новой строки. Вам нужно избежать его (то есть сказать R, что вы ищете буквальную точку), добавив перед ним \\.

Однако затем ваш шаблон будет соответствовать всем строкам в ваших демонстрационных данных.

Я предполагаю, что вы не хотите сопоставлять, например, "T_0.13", потому что оно не заканчивается на ".1", ".2" или ".3". В этом случае вы должны добавить знак доллара, чтобы указать, что вы хотите, чтобы ваша строка заканчивалась желаемым совпадением, а не просто содержала его.

vars_list <- c("\\.1$", "\\.2$","\\.3$")

df_new<-df[grepl(paste(vars_list, collapse = "|"), df$height),]
df_new
#    height value
# 1   T_0.1     1
# 2   T_0.2    12
# 3   T_0.3    14
# 7  T_10.1     5
# 8  T_10.2     9
# 9  T_10.3     4
# 13 T_36.1     1
# 14 T_36.2     2
# 15 T_36.3     7

Кстати, это можно было бы выразить и по-другому:

df[grepl("\\.[1-3]$", df$height),]

Вы можете прочитать больше здесь о синтаксисе, используемом в регулярных выражениях.

В качестве альтернативы используйте базовую функцию endsWith

df <- data.frame(height,value) %>% filter(endsWith(height,vars_list))

Created on 2023-02-12 with reprex v2.0.2

  height value
1  T_0.1     1
2  T_0.2    12
3  T_0.3    14
4 T_10.1     5
5 T_10.2     9
6 T_10.3     4
7 T_36.1     1
8 T_36.2     2
9 T_36.3     7

Другие вопросы по теме