【问题标题】:Looking for a data transformation solution (casting on complex data) in R在 R 中寻找数据转换解决方案(对复杂数据进行转换)
【发布时间】:2016-04-27 00:00:59
【问题描述】:

在工作中面临采购订单、收货和发票数据的问题。当前数据(下面是 R 代码)的问题在于它根据 MD.Doc.Type 将 PO 旅程分成两行。

PO.Document.Number<-c("Doc1","Doc1","Doc2","Doc2")
PO.Document.date<-c("12.01.2016","12.01.2016","03.01.2016","03.01.2016")
PO.Vendor<-c("200001","200001","200002","200002")
PO.Vendor.Name<-c("Vendor1","Vendor1","Vendor2","Vendor2")
BuyerCode<-c("G01","G01","G02","G02")
MD.Doc.Number<-c("500087","510035","500099","510050")
MD.Doc.Type<-c("GR","INV","GR","INV")
MD.Posting.Date<-c("04.03.2016","04.03.2016","09.03.2016","15.03.2016")
MD.Amount<-c("-67.5","80","-420.39","-420.29")
df<-data.frame(PO.Document.Number,PO.Document.date,PO.Vendor,PO.Vendor.Name,BuyerCode,MD.Doc.Number,MD.Doc.Type,MD.Posting.Date,MD.Amount)
rm(list=ls(-df))

我需要将它们合并到每个 PO 的一行中,如下所示(将 4 行合并为 2 行)。原始数据的前两行和后两行包含相同的采购订单信息(采购订单编号、日期、供应商等)。在转换中,根据 df1 中“MD.Doc.Type”中的值,df“Posting.Date”变为“GR Posting Date”或“INV Posting Date”,对于“MD.Amount”和“Doc.Amount”也是如此。号”。

PO-Document Number  PO-Document date    PO-Vendor   PO-Vendor-Name  BuyerCode   GR Number   GR Posting Date GR-Amount   Inv Number  Inv Posting Date    Inv Amount
Doc1    12.01.2016  200001  Vendor1 G01 500087  04.03.2016  -67.5   510035  04.03.2016  80
Doc2    03.01.2016  200002  Vendor2 G02 500099  09.03.2016  -420.39 510050  15.03.2016  -420.29

到目前为止我已经尝试过了:

df1<-cast(data=df, PO.Document.Number+PO.Document.date+PO.Vendor+PO.Vendor.Name+BuyerCode+MD.Doc.Number+MD.Posting.Date ~ MD.Doc.Type)

但我不确定如何从这里开始。感谢您的帮助。

【问题讨论】:

  • 不确定您所说的“将[ing]它们重新组合成一行”是什么意思。最好是您的结果示例。
  • 对不起@Adam 的困惑,我已经编辑了帖子,希望现在有意义。

标签: r transform


【解决方案1】:

考虑绑定到不同数据帧的多个 dcast:

library(reshape2)

...

# FIXED COLUMNS
fixdf <- unique(df[c('PO.Document.Number', 'PO.Document.date',
                     'PO.Vendor', 'PO.Vendor.Name', 'BuyerCode')])

# CASTED COLUMNS
finaldf <- cbind(fixdf,
                 dcast(df, PO.Document.Number ~ MD.Doc.Type,
                      value.var = 'MD.Doc.Number')[,2:3],
                 dcast(df, PO.Document.Number ~ MD.Doc.Type,
                       value.var = 'MD.Posting.Date')[,2:3],
                 dcast(df, PO.Document.Number ~ MD.Doc.Type,
                       value.var = 'MD.Amount')[,2:3])

# RENAMING CASTED COLUMNS
names(finaldf)[6:11] <- c('GR Number', 'Inv Number',
                          'GR Posting.Date', 'Inv Posting.Date',
                          'GR Amount', 'Inv Amount')

#  PO.Document.Number PO.Document.date PO.Vendor PO.Vendor.Name BuyerCode
# 1              Doc1       12.01.2016    200001        Vendor1      G01
# 2              Doc2       03.01.2016    200002        Vendor2      G02
#   GR Number Inv Number GR Posting.Date Inv Posting.Date  GR Amount Inv Amount
# 1    500087     510035      04.03.2016       04.03.2016      -67.5         80
# 2    500099     510050      09.03.2016       15.03.2016    -420.39    -420.29

【讨论】:

  • cbind + dcast 非常适合我的问题。非常感谢!
  • 很高兴听到!我很乐意提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
相关资源
最近更新 更多