У меня есть датафрейм ниже:
product<-c("ab","ab","ab","ac","ac","ac")
shop<-c("sad","sad","sad","sadas","fghj","xzzv")
category<-c("a","a","a","c","b","b")
tempr<-c(35,35,14,24,14,5)
value<-c(0,0,-6,8,4,0)
store<-data.frame(product,shop,category,tempr,value)
product shop category tempr value
1 ab sad a 35 0
2 ab sad a 35 0
3 ab sad a 14 -6
4 ac sadas c 24 8
5 ac fghj b 14 4
6 ac xzzv b 5 0
Я хочу преобразовать этот фрейм данных таким образом, чтобы я сохранял уникальные названия продуктов и превращал названия магазинов из значений полей в имена столбцов (и наоборот). Я хочу заполнить этот фрейм данных комбинацией tempr
и ее относительной value
, но только для значения, которое не равно 0, в противном случае ячейки должны быть пустыми. Тем не менее, как вы заметили, у меня есть записи, которые имеют одинаковые product
и shop
, но разные цифры tempr и value (ab-sad). Проблема в том, что они перезаписывают друг друга. В этом случае (то же имя, тот же магазин, но другой tmpr
- value
) должен преобладать ненулевой регистр. Например, 170 (62) должно отображаться вместо 170 (0), если они оба существуют. Ячейки также должны быть пустыми в случае, если товара нет в магазине. Пример окончательной формы:
store2
product sad sadas fghj xzzv
1 ab 14(-6)
2 ac 24(8) 14(4)
1-й возможный подход:
store2 <- matrix(NA,ncol=length(unique(store$shop)),nrow=length(unique(store$product)))
colnames(store2) <- unique(store$shop)
rownames(store2) <- unique(store$product)
for(i in 1:ncol(store)) {
store2[store[i,'product'],store[i,'shop']] <- paste0(store[i,c('tempr')],'(',store[i,'value'],')')
}
2-й возможный подход:
library(tidyverse)
store %>%
mutate(shop = factor(shop, levels = unique(shop))) %>%
filter(value != 0) %>%
mutate(val = sprintf("%s(%s)", tempr, value)) %>%
select(product, shop, val) %>%
group_by(product) %>%
complete(shop) %>%
spread(shop, val)
Кроме этого результата я хочу использовать category
также с той же логикой. На рисунке ниже показаны все возможные комбинации, которые мне нужны, с одинаковой логикой заполнения.