Вы можете использовать от regex
до grep
в столбце с именами сайтов, чтобы получить нужные. Вот подход, использующий data.table
(упростить subset
):
library(data.table)
# Creating a data.table with some sample data
dat <- data.table(site_name = c('montreal costco', 'laval 7 elevel', 'sherbrooke shell',
'montreal 7 eleven', 'laval costco', 'laval ultramar'),
prices = rnorm(n = 6, mean = 1.3, sd = 0.3))
> dat
site_name prices
1: montreal costco 1.050324
2: laval 7 elevel 1.521547
3: sherbrooke shell 1.079738
4: montreal 7 eleven 1.166546
5: laval costco 1.094838
6: laval ultramar 1.243748
> dat[ grep(pattern = '(costco)|(eleven)', x = site_name, ignore.case = T), ]
site_name prices
1: montreal costco 1.050324
2: montreal 7 eleven 1.166546
3: laval costco 1.094838
Если вы не хотите использовать data.table
:
> subset(dat,subset = grepl(pattern = '(costco)|(eleven)', dat$site_name, ignore.case = T))
site_name prices
1: montreal costco 1.050324
2: montreal 7 eleven 1.166546
3: laval costco 1.094838
Вы также можете используйте оператор %in%
для предоставления набора допустимых значений, которые может иметь столбец. Этот подход требует предоставления полных имен и соответствующего регистра (хотя вы можете использовать tolower
, чтобы обойти это), в отличие от более общего подхода grep
:
> dat[site_name %in% c('costco', 'eleven'), ]
Empty data.table (0 rows and 2 cols): site_name,prices
> dat[grep(pattern = '(costco)|(eleven)', x = site_name, ignore.case = T), ]
site_name prices
1: montreal costco 1.050324
2: montreal 7 eleven 1.166546
3: laval costco 1.094838
Примечание:
- Я использую
ignore.case
для учета несоответствий в верхнем / нижнем регистре - Для
7 eleven
Я использую только eleven
в своем поиске по шаблону, предполагая, что эти два всегда отображаются вместе - Это не будет в состоянии поймать имена с орфографической ошибкой, например, строка 2 в
dat
, где одиннадцать написана с ошибкой как один и тот же.