Вот пример того, как выглядят данные:
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 наблюдений. Я не уверен, в чем проблема, и я не смог найти сообщение, которое могло бы помочь. Так что любая помощь очень ценится!
Точка — это метасимвол регулярного выражения , который соответствует любому символу, кроме новой строки. Вам нужно избежать его (то есть сказать 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