Поднабор данных в R для построения ограниченных данных - PullRequest
1 голос
/ 06 апреля 2020

У меня есть набор данных (в R), называемый data, который содержит информацию о бензине, и один из столбцов - «Site_Brand», который содержит название АЗС (например, 7 Eleven)

Я хочу подмножество этих данных (или их ограничение), так что сохраняются только строки с «7 Eleven», «Caltex» или «Costco».

Я пробовал использовать myvars <- c («7 Eleven», "Caltex", "Costco") newdata <- data [myvars] Однако, когда я отображаю это на графике, данные просто не отображаются вообще. Заранее спасибо! </p>

Вот последний код Я пытался ...

# using subset function
data <- subset(data, data$Site_Brand == "7 Eleven" | data$Site_Brand == "Caltex",)

newData <- data[c("7 Eleven", "Costco", "Caltex"), ]

# Grouped Bar Plot
counts <- table(newData$Site_Brand, newData$Fuel_Type)
barplot(counts, main="Car Distribution by Gears and VS",
  xlab="Number of Gears", col=c("darkblue","red"),
  legend = rownames(counts), beside=TRUE)

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Вот предложение с использованием dplyr:

library(dplyr)

newData <- data %>%
  filter(Site_Brand %in% c("7 Eleven", "Costco", "Caltex"))

В качестве альтернативы:

newData <- data[data$Site_Brand %in% c("7 Eleven", "Costco", "Caltex"), ]
0 голосов
/ 06 апреля 2020

Вы можете использовать от 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

Примечание:

  1. Я использую ignore.case для учета несоответствий в верхнем / нижнем регистре
  2. Для 7 eleven Я использую только eleven в своем поиске по шаблону, предполагая, что эти два всегда отображаются вместе
  3. Это не будет в состоянии поймать имена с орфографической ошибкой, например, строка 2 в dat, где одиннадцать написана с ошибкой как один и тот же.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...