Ответ 1
Ответы до сих пор работают в определенной степени, но не полностью отвечают на ваш вопрос. В частности, они не рассматривают вопрос о случае, когда нет магазинов, продающих определенный продукт. Из вашего примера ввода и желаемого вывода не было магазинов, которые продавали "Product3". Действительно, "Product3" даже не появляется в вашем источнике data.frame
. Кроме того, они не учитывают возможную ситуацию с наличием более чем одной строки для каждой комбинации Shop + Product.
Здесь представлена измененная версия ваших данных и два решения. Я добавил еще одну строку для комбинации "Shop1" и "Product1". Обратите внимание, что я преобразовал ваши продукты в переменную factor
, которая включает уровни, которые может принимать переменная, даже если ни один из случаев не имеет этого уровня.
mydf <- data.frame(
Shop.Name = c("Shop1", "Shop1", "Shop2", "Shop3", "Shop3", "Shop1"),
Items = c(2, 4, 3, 2, 1, 2),
Product = factor(
c("Product1", "Product2", "Product1", "Product1", "Product4", "Product1"),
levels = c("Product1", "Product2", "Product3", "Product4")))
-
dcast
from "reshape2"library(reshape2) dcast(mydf, formula = Shop.Name ~ Product, value="Items", fill=0) # Using Product as value column: use value.var to override. # Aggregation function missing: defaulting to length # Error in .fun(.value[i], ...) : # 2 arguments passed to 'length' which requires 1
Wha? Внезапно не работает. Сделайте это вместо:
dcast(mydf, formula = Shop.Name ~ Product, fill = 0, value.var = "Items", fun.aggregate = sum, drop = FALSE) # Shop.Name Product1 Product2 Product3 Product4 # 1 Shop1 4 4 0 0 # 2 Shop2 3 0 0 0 # 3 Shop3 2 0 0 1
-
Позвольте быть oldschool.
cast
из "изменить форму"library(reshape) cast(mydf, formula = Shop.Name ~ Product, value="Items", fill=0) # Aggregation requires fun.aggregate: length used as default # Shop.Name Product1 Product2 Product4 # 1 Shop1 2 1 0 # 2 Shop2 1 0 0 # 3 Shop3 1 0 1
Э. Не то, что вы хотели снова... Попробуйте это вместо:
cast(mydf, formula = Shop.Name ~ Product, value = "Items", fill = 0, add.missing = TRUE, fun.aggregate = sum) # Shop.Name Product1 Product2 Product3 Product4 # 1 Shop1 4 4 0 0 # 2 Shop2 3 0 0 0 # 3 Shop3 2 0 0 1
-
Вернемся к основам.
xtabs
из базы Rxtabs(Items ~ Shop.Name + Product, mydf) # Product # Shop.Name Product1 Product2 Product3 Product4 # Shop1 4 4 0 0 # Shop2 3 0 0 0 # Shop3 2 0 0 1
Или, если вы предпочитаете
data.frame
(обратите внимание, что ваша переменная "Shop.Name" была преобразована вrow.names
data.frame
):as.data.frame.matrix(xtabs(Items ~ Shop.Name + Product, mydf)) # Product1 Product2 Product3 Product4 # Shop1 4 4 0 0 # Shop2 3 0 0 0 # Shop3 2 0 0 1