2016-12-31 2 views
3

У меня есть фрейм данных с именем, как Data, который имеет следующие элементы:Классификация данных в ведрах

Model Garage City Unit.Price Invoice.Date Components  
Hyundai A  NY  500  31/12/2016 HL 
Honda B  NJ  700  31/12/2016 TL  
Porsche A  NY  800  30/12/2016 TL  
BMW  B  NJ  800  30/12/2016 HL 
BMW  A  NJ  700  31/12/2016 HL 
Porsche B  NY  800  30/12/2016 TL 
Honda A  NY  400  30/12/2016 TL 
Honda A  NY  500  30/12/2016 HL 
Honda B  NY  600  30/12/2016 HL 
Honda A  NY  200  29/12/2016 TL 
Honda A  NY  300  29/12/2016 HL 

Я хочу вывод данных разбивается на автомобили отсортирован Invoice.Date так, что текущая стоимость захватывается первым.

Ex:Honda 

Components GarageA GarageB  
HL    500   600  
TL    400   700 

Это, как я начал:

Category <- as.data.frame(c("BMW","Honda","Porsche","Hyundai")) 

for(i in 1:nrow(Category)) 
{ 
    m <- Category[i,1] 
    X <- subset(Data,Model==m) 
    X <- Data[order(Data$Invoice.Date,decreasing = T),] 
    Pivot_A<-dcast(X,Name~Garage,value.var = "Unit.Price",function(x) length((x))) 
    write.csv(Pivot,file = paste(X,"Cars.csv",sep = "_")) 
} 

Единственная проблема, я получаю на карту правильную цену за единицу. Есть ли какой-либо код или функция для этого с dcast? dcast имеет опции sum, count. Что, если я хочу точную сумму, а не sum, average.

ответ

0

Мы можем сделать это с dcast от data.table. Преобразуйте «data.frame» в «data.frame» в «data.table» (setDT(df1)), order строки «Invoice.Date» и dcast от «длинный» до «широкий» с dcast, указав fun.aggregate, чтобы выбрать только первое наблюдение

library(data.table) 
library(lubridate) 
dcast(setDT(df1)[order(dmy(Invoice.Date))] , Model + Components ~ 
    paste0("Garage", Garage), value.var = "Unit.Price", function(x) x[1]) 
#  Model Components GarageA GarageB 
#1:  BMW   HL  700  800 
#2: Honda   HL  300  600 
#3: Honda   TL  200  700 
#4: Hyundai   HL  500  NA 
#5: Porsche   TL  800  800 
1

Вы можете сделать это:

require(tidyverse) # dplyr would be enough... 
dat %>% 
    mutate(Invoice.Date = as.Date(Invoice.Date, "%d/%m/%Y")) %>% 
    group_by(Model, Garage, Components) %>% 
    summarise(Unit.Price = first(Unit.Price, order_by = Invoice.Date)) %>% 
    spread(Garage, Unit.Price, sep = "") 

, который дает вам:

Model Components GarageA GarageB 
* <chr>  <chr> <int> <int> 
1  BMW   HL  700  800 
2 Honda   HL  300  600 
3 Honda   TL  200  700 
4 Hyundai   HL  500  NA 
5 Porsche   TL  800  800 

Теперь я не уверен, как интерпретировать разбивают на автомобили в вашем вопросе. Вы могли бы труба (%>%) выше в

  • split(.$Model), чтобы получить список, где каждый список-элемент представляет один модель.
  • nest(-Model) получить вложенную Тиббл ...
0

И рассмотрим лучший пакет R в, base:

library(base) # COMPLETELY REDUNDANT =) 

df <- df[with(df, order(Invoice.Date)),] 
dfagg <- aggregate(Unit.Price ~ Model + Components + Garage, df, function(i) tail(i)[1]) 
dfwide <- reshape(dfagg, timevar='Garage', idvar=c('Model', 'Components'), direction="wide") 
names(dfwide) <- gsub("Unit.Price.", "Garage", names(dfwide)) 

#  Model Components GarageA GarageB 
# 1  BMW   HL  700  800 
# 2 Honda   HL  300  600 
# 3 Hyundai   HL  500  NA 
# 4 Honda   TL  200  700 
# 5 Porsche   TL  800  800 
Смежные вопросы