首页 > 解决方案 > R合并重复

问题描述

我的数据由零件编号组成,销售日期以年、月、季度、日表示。同一零件可以在同一天出售,但发票编号不同,因此每天都有重复的零件编号。数据如下所示:

Year <- c(2016, 2016, 2016, 2017, 2017, 2018, 2018)
Month <- c("Aug", "Sep", "Sep", "Aug", "Sep", "Aug", "Sep")
Day <- c(1, 2, 2, 1, 2, 1, 2)
Revenue <- c(147, 200, 250, 300, 200, 250, 150)
PartNumber <- c("1234", "5678", "5678", "1234", "5678", "5678", "9101")

testdf <- data.frame(Year, Month, Day, Revenue, PartNumber)
> testdf
  Year Month Day Revenue PartNumber
1 2016   Aug   1     147       1234
2 2016   Sep   2     200       5678
3 2016   Sep   2     250       5678
4 2017   Aug   1     300       1234
5 2017   Sep   2     200       5678
6 2018   Aug   1     250       5678
7 2018   Sep   2     150       9101

我一直在做的是制作一个新的数据框并将一个添加到 Year 列,然后将 Revenue 列命名为 Revenue Last Year,如下所示:

testdfCopy <- testdf
testdfCopy$Year <- testdfCopy$Year + 1
colnames(testdfCopy)[4] <- "RevenueLY"
mergeddf <- merge(testdf, testdfCopy, by = c("Year", "Month", "Day", "PartNumber"), all = TRUE)

然后当我合并它们时,我将第一个数据帧收入和合并数据帧收入的总和,但它们当然会不同,所以我正在寻找一种方法来解决这个问题。我的实际数据由数百万行组成,因此希望我们能找到一种不需要手动或耗时的方法。

> sum(testdf$Revenue)
[1] 1497
> sum(mergeddf$Revenue, na.rm = TRUE)
[1] 1697

最后我得到了mergeddf:

> mergeddf
   Year Month Day PartNumber Revenue RevenueLY
1  2016   Aug   1       1234     147        NA
2  2016   Sep   2       5678     200        NA
3  2016   Sep   2       5678     250        NA
4  2017   Aug   1       1234     300       147
5  2017   Sep   2       5678     200       200
6  2017   Sep   2       5678     200       250
7  2018   Aug   1       1234      NA       300
8  2018   Aug   1       5678     250        NA
9  2018   Sep   2       5678      NA       200
10 2018   Sep   2       9101     150        NA
11 2019   Aug   1       5678      NA       250
12 2019   Sep   2       9101      NA       150

但我想要:

> finaldf
  Year Month Day Revenue PartNumber RevenueLY
1 2016   Aug   1     147       1234        NA
2 2016   Sep   2     200       5678        NA
3 2016   Sep   2     250       5678        NA
4 2017   Aug   1     300       1234       147
5 2017   Sep   2     200       5678       200
6 2018   Aug   1     250       5678        NA
7 2018   Sep   2     150       9101        NA

标签: rdataframemerge

解决方案


这是 dplyr 可能的选项(为连接表创建索引并使用 left_join):

   library(dplyr)
   testdf <- testdf%>%
    mutate(ind=paste0(Year, Month, Day), NextYear= Year+1, ind_next=paste0(NextYear, Month, Day))

    testdf%>%
    left_join(testdf[,c(4,6)], by=c("ind_next"="ind"))

推荐阅读