Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用R从XML数据生成销售报告?转换为数据帧?_R_Xml_Xpath - Fatal编程技术网

使用R从XML数据生成销售报告?转换为数据帧?

使用R从XML数据生成销售报告?转换为数据帧?,r,xml,xpath,R,Xml,Xpath,我有一些XML形式的在线订单数据。我想做一份关于订单、销售、退货等总数的报告 <ArrayOfItem> <Item> <total>333.3</total> <terminalid>1</terminalid> <subtotal>330</subtotal> <storeid>1000</storeid> <itemlist> <TransactionL

我有一些XML形式的在线订单数据。我想做一份关于订单、销售、退货等总数的报告

<ArrayOfItem>
<Item>
<total>333.3</total>
<terminalid>1</terminalid>
<subtotal>330</subtotal>
<storeid>1000</storeid>
<itemlist>
<TransactionLine><LineNumber>1</LineNumber><Name>Moto G Turbo Edition Black</Name><ItemUPC>5479892348535</ItemUPC><Quantity>1</Quantity><SalePrice>330</SalePrice><IndividualPrice>330</IndividualPrice><CreatedDate>2017-06-13T09:42:52.1411148Z</CreatedDate><Status>0</Status><ShippingCost>0</ShippingCost><TotalTax>3.3</TotalTax><AppliedTaxes><LineTax><TaxId>0</TaxId><Amount>0</Amount><CreatedDate>0001-01-01T00:00:00</CreatedDate></LineTax></AppliedTaxes><AppliedDiscounts /><ItemCondition>SellableAsNew</ItemCondition><ReturnReason>PoorQuality</ReturnReason></TransactionLine>
</itemlist>
<transactiontenders>1</transactiontenders>
<transactiontenders>2</transactiontenders>
<transactiontenders>4</transactiontenders>
<transactiontype>1</transactiontype>
<transdate>2017-06-13T09:52:54Z</transdate>
<transtime>09:52</transtime>
</Item>
<Item>
<total>343.59</total>
<terminalid>1</terminalid>
<subtotal>340.29</subtotal>
<storeid>1000</storeid>
<itemlist>
<TransactionLine><LineNumber>1</LineNumber><Name>Moto G Turbo Edition Black</Name><ItemUPC>5479892348535</ItemUPC><Quantity>1</Quantity><SalePrice>330</SalePrice><IndividualPrice>330</IndividualPrice><CreatedDate>2017-06-13T09:53:00.8548823Z</CreatedDate><Status>0</Status><ShippingCost>0</ShippingCost><TotalTax>3.3</TotalTax><AppliedTaxes><LineTax><TaxId>0</TaxId><Amount>0</Amount><CreatedDate>0001-01-01T00:00:00</CreatedDate></LineTax></AppliedTaxes><AppliedDiscounts /><ItemCondition>SellableAsNew</ItemCondition><ReturnReason>PoorQuality</ReturnReason></TransactionLine>
<TransactionLine><LineNumber>2</LineNumber><Name>This Was A Man</Name><ItemUPC>777221028297</ItemUPC><Quantity>1</Quantity><SalePrice>4.99</SalePrice><IndividualPrice>4.99</IndividualPrice><CreatedDate>2017-06-13T09:53:07.8263895Z</CreatedDate><Status>0</Status><ShippingCost>0</ShippingCost><TotalTax>0</TotalTax><AppliedTaxes /><AppliedDiscounts /><ItemCondition>SellableAsNew</ItemCondition><ReturnReason>PoorQuality</ReturnReason></TransactionLine>
<TransactionLine><LineNumber>3</LineNumber><Name>A Prisoner of Birth</Name><ItemUPC>4000111222302</ItemUPC><Quantity>1</Quantity><SalePrice>5.3</SalePrice><IndividualPrice>5.3</IndividualPrice><CreatedDate>2017-06-13T09:53:11.124866Z</CreatedDate><Status>0</Status><ShippingCost>0</ShippingCost><TotalTax>0</TotalTax><AppliedTaxes /><AppliedDiscounts /><ItemCondition>SellableAsNew</ItemCondition><ReturnReason>PoorQuality</ReturnReason></TransactionLine>
</itemlist>
<transactiontenders>1</transactiontenders><transactiontenders>2</transactiontenders>
<transactiontype>1</transactiontype>
<transdate>2017-06-13T09:53:29Z</transdate>
<transtime>09:53</transtime>
</Item>
</ArrayOfItem>

transactionlineItems
是一个XML元素列表,我想从中派生一个数据框架,应用一些逻辑(查看特定行项目是销售还是退货),并为销售和退货创建单独的合计。另外,计算每种产品的数量,看看哪种产品卖得更多。现在我正在做这个浏览器端,通过将逻辑应用到JSON格式的相同数据。我想把它移到服务器端,并选择了R编程。

如果您确实在数据帧转换上设置了热量:

你在正确的轨道上。这个答案结合了您的
xmlToDataFrame
xpathsaply
思想。您应该小心确保数值不作为字符或甚至因子处理

library(XML)

order.xml.string <- '<?xml version="1.0" encoding="UTF-8"?>
<ArrayOfItem>
<Item>
<total>333.3</total>
<terminalid>1</terminalid>
<subtotal>330</subtotal>
<storeid>1000</storeid>
<itemlist>
<TransactionLine>
<LineNumber>1</LineNumber>
<Name>Moto G Turbo Edition Black</Name>
<ItemUPC>5479892348535</ItemUPC>
<Quantity>1</Quantity>
<SalePrice>330</SalePrice>
<IndividualPrice>330</IndividualPrice>
<CreatedDate>2017-06-13T09:42:52.1411148Z</CreatedDate>
<Status>0</Status>
<ShippingCost>0</ShippingCost>
<TotalTax>3.3</TotalTax>
<AppliedTaxes>
<LineTax>
<TaxId>0</TaxId>
<Amount>0</Amount>
<CreatedDate>0001-01-01T00:00:00</CreatedDate>
</LineTax>
</AppliedTaxes>
<AppliedDiscounts/>
<ItemCondition>SellableAsNew</ItemCondition>
<ReturnReason>PoorQuality</ReturnReason>
</TransactionLine>
</itemlist>
<transactiontenders>1</transactiontenders>
<transactiontenders>2</transactiontenders>
<transactiontenders>4</transactiontenders>
<transactiontype>1</transactiontype>
<transdate>2017-06-13T09:52:54Z</transdate>
<transtime>09:52</transtime>
</Item>
<Item>
<total>343.59</total>
<terminalid>1</terminalid>
<subtotal>340.29</subtotal>
<storeid>1000</storeid>
<itemlist>
<TransactionLine>
<LineNumber>1</LineNumber>
<Name>Moto G Turbo Edition Black</Name>
<ItemUPC>5479892348535</ItemUPC>
<Quantity>1</Quantity>
<SalePrice>330</SalePrice>
<IndividualPrice>330</IndividualPrice>
<CreatedDate>2017-06-13T09:53:00.8548823Z</CreatedDate>
<Status>0</Status>
<ShippingCost>0</ShippingCost>
<TotalTax>3.3</TotalTax>
<AppliedTaxes>
<LineTax>
<TaxId>0</TaxId>
<Amount>0</Amount>
<CreatedDate>0001-01-01T00:00:00</CreatedDate>
</LineTax>
</AppliedTaxes>
<AppliedDiscounts/>
<ItemCondition>SellableAsNew</ItemCondition>
<ReturnReason>PoorQuality</ReturnReason>
</TransactionLine>
<TransactionLine>
<LineNumber>2</LineNumber>
<Name>This Was A Man</Name>
<ItemUPC>777221028297</ItemUPC>
<Quantity>1</Quantity>
<SalePrice>4.99</SalePrice>
<IndividualPrice>4.99</IndividualPrice>
<CreatedDate>2017-06-13T09:53:07.8263895Z</CreatedDate>
<Status>0</Status>
<ShippingCost>0</ShippingCost>
<TotalTax>0</TotalTax>
<AppliedTaxes/>
<AppliedDiscounts/>
<ItemCondition>SellableAsNew</ItemCondition>
<ReturnReason>PoorQuality</ReturnReason>
</TransactionLine>
<TransactionLine>
<LineNumber>3</LineNumber>
<Name>A Prisoner of Birth</Name>
<ItemUPC>4000111222302</ItemUPC>
<Quantity>1</Quantity>
<SalePrice>5.3</SalePrice>
<IndividualPrice>5.3</IndividualPrice>
<CreatedDate>2017-06-13T09:53:11.124866Z</CreatedDate>
<Status>0</Status>
<ShippingCost>0</ShippingCost>
<TotalTax>0</TotalTax>
<AppliedTaxes/>
<AppliedDiscounts/>
<ItemCondition>SellableAsNew</ItemCondition>
<ReturnReason>PoorQuality</ReturnReason>
</TransactionLine>
</itemlist>
<transactiontenders>1</transactiontenders>
<transactiontenders>2</transactiontenders>
<transactiontype>1</transactiontype>
<transdate>2017-06-13T09:53:29Z</transdate>
<transtime>09:53</transtime>
</Item>
</ArrayOfItem>'

如果您确实在数据帧转换上设置了热量:

你在正确的轨道上。这个答案结合了您的
xmlToDataFrame
xpathsaply
思想。您应该小心确保数值不作为字符或甚至因子处理

library(XML)

order.xml.string <- '<?xml version="1.0" encoding="UTF-8"?>
<ArrayOfItem>
<Item>
<total>333.3</total>
<terminalid>1</terminalid>
<subtotal>330</subtotal>
<storeid>1000</storeid>
<itemlist>
<TransactionLine>
<LineNumber>1</LineNumber>
<Name>Moto G Turbo Edition Black</Name>
<ItemUPC>5479892348535</ItemUPC>
<Quantity>1</Quantity>
<SalePrice>330</SalePrice>
<IndividualPrice>330</IndividualPrice>
<CreatedDate>2017-06-13T09:42:52.1411148Z</CreatedDate>
<Status>0</Status>
<ShippingCost>0</ShippingCost>
<TotalTax>3.3</TotalTax>
<AppliedTaxes>
<LineTax>
<TaxId>0</TaxId>
<Amount>0</Amount>
<CreatedDate>0001-01-01T00:00:00</CreatedDate>
</LineTax>
</AppliedTaxes>
<AppliedDiscounts/>
<ItemCondition>SellableAsNew</ItemCondition>
<ReturnReason>PoorQuality</ReturnReason>
</TransactionLine>
</itemlist>
<transactiontenders>1</transactiontenders>
<transactiontenders>2</transactiontenders>
<transactiontenders>4</transactiontenders>
<transactiontype>1</transactiontype>
<transdate>2017-06-13T09:52:54Z</transdate>
<transtime>09:52</transtime>
</Item>
<Item>
<total>343.59</total>
<terminalid>1</terminalid>
<subtotal>340.29</subtotal>
<storeid>1000</storeid>
<itemlist>
<TransactionLine>
<LineNumber>1</LineNumber>
<Name>Moto G Turbo Edition Black</Name>
<ItemUPC>5479892348535</ItemUPC>
<Quantity>1</Quantity>
<SalePrice>330</SalePrice>
<IndividualPrice>330</IndividualPrice>
<CreatedDate>2017-06-13T09:53:00.8548823Z</CreatedDate>
<Status>0</Status>
<ShippingCost>0</ShippingCost>
<TotalTax>3.3</TotalTax>
<AppliedTaxes>
<LineTax>
<TaxId>0</TaxId>
<Amount>0</Amount>
<CreatedDate>0001-01-01T00:00:00</CreatedDate>
</LineTax>
</AppliedTaxes>
<AppliedDiscounts/>
<ItemCondition>SellableAsNew</ItemCondition>
<ReturnReason>PoorQuality</ReturnReason>
</TransactionLine>
<TransactionLine>
<LineNumber>2</LineNumber>
<Name>This Was A Man</Name>
<ItemUPC>777221028297</ItemUPC>
<Quantity>1</Quantity>
<SalePrice>4.99</SalePrice>
<IndividualPrice>4.99</IndividualPrice>
<CreatedDate>2017-06-13T09:53:07.8263895Z</CreatedDate>
<Status>0</Status>
<ShippingCost>0</ShippingCost>
<TotalTax>0</TotalTax>
<AppliedTaxes/>
<AppliedDiscounts/>
<ItemCondition>SellableAsNew</ItemCondition>
<ReturnReason>PoorQuality</ReturnReason>
</TransactionLine>
<TransactionLine>
<LineNumber>3</LineNumber>
<Name>A Prisoner of Birth</Name>
<ItemUPC>4000111222302</ItemUPC>
<Quantity>1</Quantity>
<SalePrice>5.3</SalePrice>
<IndividualPrice>5.3</IndividualPrice>
<CreatedDate>2017-06-13T09:53:11.124866Z</CreatedDate>
<Status>0</Status>
<ShippingCost>0</ShippingCost>
<TotalTax>0</TotalTax>
<AppliedTaxes/>
<AppliedDiscounts/>
<ItemCondition>SellableAsNew</ItemCondition>
<ReturnReason>PoorQuality</ReturnReason>
</TransactionLine>
</itemlist>
<transactiontenders>1</transactiontenders>
<transactiontenders>2</transactiontenders>
<transactiontype>1</transactiontype>
<transdate>2017-06-13T09:53:29Z</transdate>
<transtime>09:53</transtime>
</Item>
</ArrayOfItem>'

谢谢,这是一天的在线订单XML。在一个购物网站上,一天内会有多个订单。每个顺序由标记表示。在一个订单中,客户可以购买许多物品,每个物品都用“”表示。每个交易行都有数量、状态(销售或退货)、价格。如果我可以将所有事务行的列表转换为单个数据帧,那么执行其他步骤就会更容易。比如哪件商品买得最多,有多少出售或退货。我在上面的代码中看到一个元素被取出用于求和。谢谢,我将尝试数据帧和列表。现在,在服务器端,我正在将XML转换为Json。整个逻辑是在浏览器上使用javascript完成的,通过循环每个顺序分离必要的属性。我担心如果响应太大,浏览器可能会崩溃。我的同事让我尝试R编程。谢谢,这是一天的在线订购XML。在一个购物网站上,一天内会有多个订单。每个顺序由标记表示。在一个订单中,客户可以购买许多物品,每个物品都用“”表示。每个交易行都有数量、状态(销售或退货)、价格。如果我可以将所有事务行的列表转换为单个数据帧,那么执行其他步骤就会更容易。比如哪件商品买得最多,有多少出售或退货。我在上面的代码中看到一个元素被取出用于求和。谢谢,我将尝试数据帧和列表。现在,在服务器端,我正在将XML转换为Json。整个逻辑是在浏览器上使用javascript完成的,通过循环每个顺序分离必要的属性。我担心如果响应太大,浏览器可能会崩溃。我的同事让我试试R编程。
library(XML)

order.xml.string <- '<?xml version="1.0" encoding="UTF-8"?>
<ArrayOfItem>
<Item>
<total>333.3</total>
<terminalid>1</terminalid>
<subtotal>330</subtotal>
<storeid>1000</storeid>
<itemlist>
<TransactionLine>
<LineNumber>1</LineNumber>
<Name>Moto G Turbo Edition Black</Name>
<ItemUPC>5479892348535</ItemUPC>
<Quantity>1</Quantity>
<SalePrice>330</SalePrice>
<IndividualPrice>330</IndividualPrice>
<CreatedDate>2017-06-13T09:42:52.1411148Z</CreatedDate>
<Status>0</Status>
<ShippingCost>0</ShippingCost>
<TotalTax>3.3</TotalTax>
<AppliedTaxes>
<LineTax>
<TaxId>0</TaxId>
<Amount>0</Amount>
<CreatedDate>0001-01-01T00:00:00</CreatedDate>
</LineTax>
</AppliedTaxes>
<AppliedDiscounts/>
<ItemCondition>SellableAsNew</ItemCondition>
<ReturnReason>PoorQuality</ReturnReason>
</TransactionLine>
</itemlist>
<transactiontenders>1</transactiontenders>
<transactiontenders>2</transactiontenders>
<transactiontenders>4</transactiontenders>
<transactiontype>1</transactiontype>
<transdate>2017-06-13T09:52:54Z</transdate>
<transtime>09:52</transtime>
</Item>
<Item>
<total>343.59</total>
<terminalid>1</terminalid>
<subtotal>340.29</subtotal>
<storeid>1000</storeid>
<itemlist>
<TransactionLine>
<LineNumber>1</LineNumber>
<Name>Moto G Turbo Edition Black</Name>
<ItemUPC>5479892348535</ItemUPC>
<Quantity>1</Quantity>
<SalePrice>330</SalePrice>
<IndividualPrice>330</IndividualPrice>
<CreatedDate>2017-06-13T09:53:00.8548823Z</CreatedDate>
<Status>0</Status>
<ShippingCost>0</ShippingCost>
<TotalTax>3.3</TotalTax>
<AppliedTaxes>
<LineTax>
<TaxId>0</TaxId>
<Amount>0</Amount>
<CreatedDate>0001-01-01T00:00:00</CreatedDate>
</LineTax>
</AppliedTaxes>
<AppliedDiscounts/>
<ItemCondition>SellableAsNew</ItemCondition>
<ReturnReason>PoorQuality</ReturnReason>
</TransactionLine>
<TransactionLine>
<LineNumber>2</LineNumber>
<Name>This Was A Man</Name>
<ItemUPC>777221028297</ItemUPC>
<Quantity>1</Quantity>
<SalePrice>4.99</SalePrice>
<IndividualPrice>4.99</IndividualPrice>
<CreatedDate>2017-06-13T09:53:07.8263895Z</CreatedDate>
<Status>0</Status>
<ShippingCost>0</ShippingCost>
<TotalTax>0</TotalTax>
<AppliedTaxes/>
<AppliedDiscounts/>
<ItemCondition>SellableAsNew</ItemCondition>
<ReturnReason>PoorQuality</ReturnReason>
</TransactionLine>
<TransactionLine>
<LineNumber>3</LineNumber>
<Name>A Prisoner of Birth</Name>
<ItemUPC>4000111222302</ItemUPC>
<Quantity>1</Quantity>
<SalePrice>5.3</SalePrice>
<IndividualPrice>5.3</IndividualPrice>
<CreatedDate>2017-06-13T09:53:11.124866Z</CreatedDate>
<Status>0</Status>
<ShippingCost>0</ShippingCost>
<TotalTax>0</TotalTax>
<AppliedTaxes/>
<AppliedDiscounts/>
<ItemCondition>SellableAsNew</ItemCondition>
<ReturnReason>PoorQuality</ReturnReason>
</TransactionLine>
</itemlist>
<transactiontenders>1</transactiontenders>
<transactiontenders>2</transactiontenders>
<transactiontype>1</transactiontype>
<transdate>2017-06-13T09:53:29Z</transdate>
<transtime>09:53</transtime>
</Item>
</ArrayOfItem>'
doc  <-  xmlParse(order.xml.string, asText = TRUE)
y <-
  xmlToDataFrame(nodes = getNodeSet(doc, "//TransactionLine"),
                 stringsAsFactors = FALSE)
nrow(y) # To get total number of order

numeric.cols <- c("Quantity",
                  "SalePrice",
                  "IndividualPrice",
                  "ShippingCost",
                  "TotalTax")

y[, numeric.cols] <-
  lapply(y[, numeric.cols], as.numeric)

colSums(y[(y$ItemCondition == "SellableAsNew" &
             y$ReturnReason == "PoorQuality"), numeric.cols])

Quantity       SalePrice IndividualPrice    ShippingCost        TotalTax
   4.00          670.29          670.29            0.00            6.60 
order.xml <-
  xmlTreeParse(order.xml.string,
               asText = TRUE,
               useInternalNodes = TRUE)
orders <- xmlRoot(order.xml)
y <- xmlToList(orders)

my.totals <- sapply(y, function(one.item) {
  return(as.numeric(one.item$total))
})

total.total <- sum(my.totals)
print(total.total)

[1] 676.89