Как подмножество на основе нескольких переменных в одном столбце

#r #dataframe #subset

#r #фрейм данных #подмножество

Вопрос:

Добрый день,

Я пытаюсь отфильтровать фрейм данных, который включает 94 разных товара и сколько они были проданы в разные часы, по 15 лучшим товарам, проданным в целом, из приведенных ниже данных:

 structure(list(Time = c("07", "07", "07", "07", "07", "08"), 
Item = c("Bread", "Coffee", "Medialuna", "Pastry", "Toast", 
"Afternoon with the baker"), Transactions = c(2L, 13L, 6L, 
2L, 1L, 3L)), row.names = c(NA, -6L), groups = structure(list(
Time = c("07", "08"), .rows = structure(list(1:5, 6L), ptype = integer(0), class = c("vctrs_list_of", 
"vctrs_vctr", "list"))), row.names = 1:2, class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))
 

Я уже знаю 15 самых популярных товаров по названию («Кофе», «Чай», «Хлеб» и т.д.), И я попытался подмножество фрейма данных, используя приведенный ниже код:

 SalesPerTimePerItem <- subset(SalesPerTimePerItem,
                          Item == c("Coffee",
                                    "Tea",
                                    "Bread",
                                    "Cake",
                                    "Pastry",
                                    "Sandwich",
                                    "Medialuna",
                                    "Hot chocolate",
                                    "Cookies",
                                    "Brownie",
                                    "Farm House",
                                    "Muffin",
                                    "Alfajores",
                                    "Juice",
                                    "Soup"))
 

Но я получил эту ошибку:

 In Item == c("Coffee", "Tea", "Bread", "Cake", "Pastry", "Sandwich",  :
  longer object length is not a multiple of shorter object length
 

Я также попробовал другой метод, приведенный ниже:

 SalesPTPI <- SalesPTPI[SalesPTPI$Item %in% c("Coffee",
                                         "Tea",
                                         "Bread",
                                         "Cake",
                                         "Pastry",
                                         "Sandwich",
                                         "Medialuna",
                                         "Hot chocolate",
                                         "Cookies",
                                         "Brownie",
                                         "Farm House",
                                         "Muffin",
                                         "Alfajores",
                                         "Juice",
                                         "Soup")]
 

Но получил ошибку:

 Error: Must subset columns with a valid subscript vector.
i Logical subscripts must match the size of the indexed input.
x Input has size 3 but subscript `i` has size 631.
 

Моя цель с этими данными — создать гистограмму, подобную той, которую я привел ниже:

введите описание изображения здесь

но с разными объектами:

 (x = Time, y = Transactions, fill = Item)
 

Как я могу отфильтровать только ответы «Кофе» и т. Д. Из фрейма данных, включенного вверху?

Ответ №1:

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

Чтобы исправить это, замените == на %in%


Ваш второй пример неверен, потому df[df$var %in% vals] что выбирает столбцы, а не строки.

Чтобы исправить это, добавьте запятую после выражения df[df$var %in% vals,]

Комментарии:

1. Я знаю, что они ошибочны, поэтому я прошу помощи на этом веб-сайте, который предназначен для справки по кодированию. Почему было необходимо редактировать мой пост как таковой? Вы первый, кто принудительно редактирует один из моих постов, и некоторые исправления даже не верны. Вы делаете это для всех сообщений? Я новичок в SO, поэтому, пожалуйста, объясните, является ли это нормальным поведением. Спасибо за помощь. (Извините, если это звучит грубо или конфронтационно, мне просто искренне любопытно).

2. Редактирование записей, чтобы сделать их более понятными, является стандартной практикой. Какие из моих исправлений показались вам неправильными?

3. ‘Как я могу фильтровать …’ грамматически неверно. Правильная версия: «Как я могу фильтровать …»

4. Это не было внесено моим изменением, поскольку ваша версия была: «Итак, есть идеи, как я могу фильтровать», я просто сделал это короче. Вы можете проверить эффект моих изменений, нажав на маленький текст над моим аватаром в вашем сообщении, где написано «отредактировано 50 минут назад»

5. Да, использование «Итак, любая идея …» делает этот синтаксис грамматически правильным. Вы отредактировали грамматически правильное утверждение и преобразовали его в грамматически неправильное утверждение. Если ваша правка привела к неправильному предложению, это не моя вина как автора оригинала, а ваша как редактора. Вы должны проверить свои правки, вот и все.