Превратите имена полей в имена столбцов для определенных переменных и заполните их определенной логикой - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть датафрейм ниже:

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 также с той же логикой. На рисунке ниже показаны все возможные комбинации, которые мне нужны, с одинаковой логикой заполнения.

enter image description here

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018
store$shop<-factor(store$shop,levels=c("sad","sadas","fghj","xzzv")) 
 #to avoid the change of column sequence of final outcome

store$tv<-ifelse(store$value==0,"",paste(store$tempr,"(",store$value,")",sep=""))

cast(store[,c(-3,-4,-5)],product~shop,function(x) paste(x,sep="",collapse=""), value="tv")
#due to one colname of the original store dataset is "value", firstly masked 
#the original "value" column,otherwise, it automatically used as value-fill 
# column
product    sad sadas  fghj xzzv
     ab 14(-6)                 
     ac        24(8) 14(4)" 
0 голосов
/ 12 сентября 2018

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

library(tidyverse)
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)


store %>% filter(value != 0 ) %>%  # Remove 0 values 
  mutate(combined =  paste0(tempr,"(",value,")")) %>% # Combine columns for spread
  select(-tempr,-value) %>%  #
  spread(shop,combined) # spread to create shop columns and temr/value values. 

  #       product category  fghj    sad     sadas
  # 1      ab        a      <NA>    14(-6)  <NA>
  # 2      ac        b       14(4) <NA>     <NA>
  # 3      ac        c      <NA>   <NA>     24(8)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...