0

次のようなデータ フレーム (「dk」と呼ばれる) があります。

Date        Country  ID      Description    Qty
21/05/2014  DK       17423   Frontline      240
26/05/2014  DK       17423   Frontline      360
21/05/2014  DK       73663   Frontline      77
21/05/2014  DK       73663   Frontline      120
...

IDごとに数量を合計したい。結果には、国と説明 (ID と数量に加えて) が表示されます。また、1 つの ID の日付が異なる場合は、次のように早い日付でマークします。

Date        Country ID      Description      Qty
21/05/2014  DK      17423   Frontline        600
21/05/2014  DK      73663   Frontline        197

を使用aggregateしましたが、他の列から情報が削除されました。

data <- aggregate(dk$Qty ~ dk$ID, subset(dk, ID == 17423),sum)

ID      Qty
17423   600
73663   197

説明どおりの結果を得るにはどうすればよいですか?

ありがとうございました。

4

2 に答える 2

4

別のオプションは、次を使用することdplyrです。

require(dplyr)

dk %>%
  mutate(Date = as.Date(as.character(Date), format="%d/%m/%Y")) %>%
  group_by(ID) %>%
  summarize(Date = min(Date),
            Qty = sum(Qty),
            Country = first(Country),
            Description = first(Description))

#     ID       Date Qty Country Description
#1 17423 2014-05-21 600      DK   Frontline
#2 73663 2014-05-21 197      DK   Frontline

このようにして、 ごとに 1 行を取得しID、 の合計、およびID ごとの最小エントリと最初のエントリを取得します。たとえば、 でグループ化し、ごとに異なる説明がある場合、結果は異なって見えることに注意してください。結果が同じに見えるのは、サンプル データに異なる説明と国がないからです。QtyIDDateIDCountryDescriptionIDDescriptionID

于 2014-05-30T09:59:55.120 に答える
3

パッケージでそれを行うこともできます(日付はクラスdata.tableであると想定します)Date

library(data.table)
setDT(dk)[, list(Qty = sum(Qty), Date = min(Date)), by = c("ID", "Country", "Description")]

のみで集計したい場合IDは、次のようにすることができます(残りの列の最初の引数が必要だと仮定した場合)

setDT(dk)[, lapply(.SD, function(x) ifelse(is.numeric(x), sum(x), head(as.character(x), 1))), by = ID]

Dateクラスでない場合はDate、最初に行うことができます

dk <- data.table(dk, key = "ID") # Creates a data.table object and sorts it by "ID"
dk[, Date:= as.Date(as.character(Date), "%d/%m/%Y")] #Transforms Date to "Date" class

次に、通常どおりに続行できます(setDTすでにdata.tableクラスになっているため、省略できます)。たとえば、次のようになります。

dk[, list(Qty = sum(Qty), Date = min(Date)), by = c("ID", "Country", "Description")]

##       ID Country Description Qty       Date
## 1: 17423      DK   Frontline 600 2014-05-21
## 2: 73663      DK   Frontline 197 2014-05-21
于 2014-05-30T09:42:40.313 に答える