2013-11-12 5 views
4

Вот мой исходный результат.Преобразование данных с R

BizDate  Description        TotalAmount TotalQty 
2013-09-01 NIN JIOM COUGH SYRUP 75ML    11.8  2 
2013-09-01 BREACOL COUGH SYRUP ADULTS 120ML   15.8  2 
2013-09-02 AFRICAN SEA-COCONUT COUGH SYRUP 177ML 8.5   1 
2013-09-03 AFRICAN SEA COCONUT COUGH SYRUP 177ML 8.2   1 
2013-09-01 THREE LEGS COOLING WATER 200ML   21.0  14 
2013-09-01 SEAHORSE BRAND COOLING WATER 200ML  4.4   4 
2013-09-05 AFRICAN SEA-COCONUT COUGH SYRUP 177ML 8.5   1 
2013-09-06 AFRICAN SEA COCONUT COUGH SYRUP 177ML 8.2   1 

Как бы превратить его в нечто вроде этого

Description        2013-09-01 2013-09-02 ....... 
NIN JIOM COUGH SYRUP 75ML    some number some number ....... 
BREACOL COUGH SYRUP ADULTS 120ML   some number some number ....... 
AFRICAN SEA-COCONUT COUGH SYRUP 177ML some number some number ....... 
AFRICAN SEA COCONUT COUGH SYRUP 177ML some number some number ....... 
THREE LEGS COOLING WATER 200ML   some number some number ....... 
SEAHORSE BRAND COOLING WATER 200ML  some number some number ....... 
AFRICAN SEA-COCONUT COUGH SYRUP 177ML some number some number ....... 
AFRICAN SEA COCONUT COUGH SYRUP 177ML some number some number ....... 

Вот некоторые поддельные данные.

set.seed(1) 
dat <- data.frame(product = rep(letters[1:4], each = 4) 
    , date = sample(seq(as.Date("2013-01-01"), as.Date("2013-01-10"), by = 1), 16, TRUE) 
    , amount = sample(1:100, 16, TRUE) 
    , qty = sample(1:4, 16, TRUE)) 

dat 
    product  date amount qty 
1  a 2013-01-03  72 2 
2  a 2013-01-04 100 1 
3  a 2013-01-06  39 4 
4  a 2013-01-10  78 3 
5  b 2013-01-03  94 4 
6  b 2013-01-09  22 1 
7  b 2013-01-10  66 3 
8  b 2013-01-07  13 2 
9  c 2013-01-07  27 4 
10  c 2013-01-01  39 3 
11  c 2013-01-03  2 4 
12  c 2013-01-02  39 3 
13  d 2013-01-07  87 3 
14  d 2013-01-04  35 4 
15  d 2013-01-08  49 1 
16  d 2013-01-05  60 2 

Мой тупой способ сделать это. Есть ли умнее сделать это? Я думаю использовать plyr. просто направьте меня в нужный пакет или путь.

dat1<-subset(dat,date=="2013-01-01") 
colnames(dat1)[c(3,4)]<-c("2013-01-01.amount","2013-01-01.qty") 
dat1<-dat1[-2] 
dat2<-subset(dat,date=="2013-01-02") 
colnames(dat2)[c(3,4)]<-c("2013-01-02.amount","2013-01-02.qty") 
dat2<-dat2[-2] 
dat3<-subset(dat,date=="2013-01-03") 
colnames(dat3)[c(3,4)]<-c("2013-01-03.amount","2013-01-03.qty") 
dat3<-dat3[-2] 

new.dat<-merge(dat1,dat2,by="product",all.x=T,all.y=T) 
new.dat<-merge(new.dat,dat3,by="product",all.x=T,all.y=T) 
new.dat[is.na(new.dat)]<-0 

new.dat 
    product 2013-01-01.amount 2013-01-01.qty 2013-01-02.amount 2013-01-02.qty 
1  a     0    0     0    0 
2  b     0    0     0    0 
3  c    39    3    39    3 
    2013-01-03.amount 2013-01-03.qty 
1    72    2 
2    94    4 
3     2    4 
+0

Это создаст n строк и 61 столбца. Благодарю. –

+5

Что вы пытались? На каких пакетах вы смотрели? Вы проводили какие-либо исследования для решения самостоятельно? Какие функции, по вашему мнению, могут быть полезны? Пожалуйста, проявите немного желания. Это не * я даю данные, вы пишете код * сайта. –

+0

Я использую plyr. Пока не повезло. пытался много способов. Я нашел тупой способ сделать это, подбирая день и переименовать его вручную. И присоединяйтесь к ним. Мне просто нужен более умный способ сделать это. Сожалею. –

ответ

3

Попробуйте это:

#Dummy data 
df <- read.table(text=" 
BizDate Description TotalAmount TotalQty 
2013-09-01 NIN 11.8 2 
2013-09-01 BREACOL 15.8 2 
2013-09-02 AFRICAN 8.5 1 
2013-09-03 AFRICAN 8.2 1 
2013-09-01 THREE 21.0 14 
2013-09-01 SEAHORSE 4.4 4 
2013-09-05 AFRICAN 8.5 1 
2013-09-06 AFRICAN 8.2 1", 
       header=TRUE) 

library(reshape2) 

dcast(df,Description~BizDate,value="TotalAmount") 
#Description 2013-09-01 2013-09-02 2013-09-03 2013-09-05 2013-09-06 
#1  AFRICAN   NA  8.5  8.2  8.5  8.2 
#2  BREACOL  15.8   NA   NA   NA   NA 
#3   NIN  11.8   NA   NA   NA   NA 
#4 SEAHORSE  4.4   NA   NA   NA   NA 
#5  THREE  21.0   NA   NA   NA   NA 
dcast(df,Description~BizDate,value="TotalQty") 
#Description 2013-09-01 2013-09-02 2013-09-03 2013-09-05 2013-09-06 
#1  AFRICAN   NA   1   1   1   1 
#2  BREACOL   2   NA   NA   NA   NA 
#3   NIN   2   NA   NA   NA   NA 
#4 SEAHORSE   4   NA   NA   NA   NA 
#5  THREE   14   NA   NA   NA   NA 
+0

спасибо. и теперь я знаю правильный пакет для этого. –

+0

@ chee.work.stuff, я бы не назвал «переформировать» правильный пакет для него, так как он не активно разрабатывается и имеет следующий пакет. zx8754, я бы предложил обновление до «reshape2». – A5C1D2H2I1M1N2O1R2T1

+0

@ Ананда Махто спасибо –

4

Учитывая текущую форму ваших данных, просто используйте reshape из базы R:

> reshape(dat, direction = "wide", idvar="product", timevar="date") 
    product amount.2013-01-03 qty.2013-01-03 amount.2013-01-04 qty.2013-01-04 amount.2013-01-06 
1  a    72    2    100    1    39 
5  b    94    4    NA    NA    NA 
9  c     2    4    NA    NA    NA 
13  d    NA    NA    35    4    NA 
    qty.2013-01-06 amount.2013-01-10 qty.2013-01-10 amount.2013-01-09 qty.2013-01-09 
1    4    78    3    NA    NA 
5    NA    66    3    22    1 
9    NA    NA    NA    NA    NA 
13    NA    NA    NA    NA    NA 
    amount.2013-01-07 qty.2013-01-07 amount.2013-01-01 qty.2013-01-01 amount.2013-01-02 
1     NA    NA    NA    NA    NA 
5     13    2    NA    NA    NA 
9     27    4    39    3    39 
13    87    3    NA    NA    NA 
    qty.2013-01-02 amount.2013-01-08 qty.2013-01-08 amount.2013-01-05 qty.2013-01-05 
1    NA    NA    NA    NA    NA 
5    NA    NA    NA    NA    NA 
9    3    NA    NA    NA    NA 
13    NA    49    1    60    2 

В качестве альтернативы, вы можете рассмотреть «reshape2 "пакет:

library(reshape2) 
datL <- melt(dat, id.vars=c("product", "date")) 
dcast(datL, product ~ date + variable, value.var="value") 
Смежные вопросы