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 和数量)。如果一个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

这样,您将获得每个 行ID、该行的总和、Qty每个ID的ID最小值和第一个条目。请注意,如果您按例如分组,并且每个 有不同的描述,您的结果看起来会有所不同。只是因为您的样本数据没有不同的描述和国家,结果看起来是一样的。DateIDCountryDescriptionIDDescriptionID

于 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 回答