【问题标题】:How to add together certain rows within a column in R by unique IDs?如何通过唯一ID将R中一列中的某些行加在一起?
【发布时间】:2020-05-21 06:08:43
【问题描述】:

如果我的问题措辞不当,我很抱歉。

我在 r 工作,我有一个名为 Rent 的表,可能看起来像这样:

Rent
       ID      Invoice    Payment      Paid Date
       lucy   7/1/2018     100        9/1/2018
       lucy   7/1/2018     150        10/1/2018
       lucy   8/1/2018     100        11/1/2018

所以我想做的是,由于 Lucy 在 2018 年 7 月 1 日有两次付款,我想将它们合并在一起,然后将付款相加,并使用最新的付款日期。

到目前为止,我所拥有的是

#to create a row that has the sum of the sales prices 

    Rent[,sum_late:=sum( as.numeric(("Sales Price"))),
    by= c("Id","Invoice Date")]

#take the first of the unique IDs by the max paid date
    head (SD,1) by=c("ID", "Invoice Date", max("Paid Date") 

但是当我运行第一行时,所有 sum_late 列都是 N/A。我不确定我做错了什么。理想情况下,我想要一张这样的桌子。

Rent
       ID      Invoice    Payment      Paid Date
       lucy   7/1/2018     250        10/1/2018
       lucy   8/1/2018     100        11/1/2018

对不起,如果这是一个愚蠢的问题,我感谢任何帮助和反馈!谢谢大家的时间!!

【问题讨论】:

    标签: r uniqueidentifier column-sum


    【解决方案1】:

    我们可以将Paid_Date更改为日期类,group_byIDInvoicesumPayment并选择maxPaid_Date

    library(dplyr)
    Rent %>%
      mutate_at(vars(Invoice, Paid_Date), as.Date, '%d/%m/%Y') %>%
      group_by(ID, Invoice) %>%
      summarise(Payment = sum(Payment), 
                Paid_Date = max(Paid_Date))
    
    #  ID    Invoice    Payment Paid_Date 
    #  <chr> <date>       <int> <date>    
    #1 lucy  2018-01-07     250 2018-01-10
    #2 lucy  2018-01-08     100 2018-01-11
    

    或者,如果您更喜欢 data.table 使用相同的逻辑。

    library(data.table)
    setDT(Rent)[, c("Invoice", "Paid_Date") := .(as.IDate(Invoice, '%d/%m/%Y'), 
                                                 as.IDate(Paid_Date, '%d/%m/%Y'))]
    Rent[, .(Payment = sum(Payment), Paid_Date = max(Paid_Date)), .(ID, Invoice)]
    

    数据

    Rent <- structure(list(ID = c("lucy", "lucy", "lucy"), Invoice = c("7/1/2018", 
    "7/1/2018", "8/1/2018"), Payment = c(100L, 150L, 100L), Paid_Date = c("9/1/2018", 
    "10/1/2018", "11/1/2018")), class = "data.frame", row.names = c(NA, -3L))
    

    【讨论】:

    • 嗨罗纳克,非常感谢!如果我的日期已经是 2019-10-09 格式,而且我实际上还有这三个以外的其他列,这是否意味着我只使用 ` library(dplyr) rent %>% mutate_at(. %>%) group_by(ID , 发票) %>% summarise(Payment = sum(Payment), Paid_Date = max(Paid_Date))`?
    • 您可以在group_by中添加您想要保留的列。
    • 我没有运行mutate代码,因为我的日期已经是正确的格式,但我发现即使我把它放在max(支付日期),后面的支付日期行仍然存在。
    • 抱歉问了这么简单的问题,我只写了 Rent%>% group_by('Id', 'Invoice') %>% summarise(Sales Price = sum(Sales Price), 'Paid_Date' = max('Paid_Date'))
    • 1) 不要直接复制粘贴代码,使用数据中的列和数据框名称。通常,最好让列的名称中没有任何空格,但如果列的名称中有空格,请将它们与反引号一起使用。就像这个`Paid Date`。 2) class(Rent$Paid_Date) 是什么? 3) 在dplyr/data.table 函数中指定列名时不要使用引号,例如“id”“Invoice”等。使用裸列名。
    【解决方案2】:

    有多种方法可以完成这项任务,我将使用 for 循环来创建所需的输出。我使用 dplyr 方法与@Ronak Shah 相呼应,由于使用 for-loops 可以减少处理时间

    数据

    Rent <- structure(list(ID = c("lucy", "lucy", "lucy"), Invoice = c("7/1/2018", 
                                                                       "7/1/2018", "8/1/2018"), Payment = c(100L, 150L, 100L), Paid_Date = c("9/1/2018", 
                                                                                                                                             "10/1/2018", "11/1/2018")), class = "data.frame", row.names = c(NA, -3L))
    

    将 Paid_date 转换为日期格式

    Rent$Paid_Date <- as.Date(Rent$Paid_Date, "%d/%m/%Y")
    

    For 循环

    for ( i in unique (Rent$ID)){
      for (j in unique(Rent$Invoice[Rent$ID == i])){
        Rent$Payment_[Rent$ID==i & Rent$Invoice ==j ] <- sum (Rent$Payment [Rent$ID==i & Rent$Invoice ==j])
        Rent$Paid_dt[Rent$ID==i & Rent$Invoice ==j ] <- max(Rent$Paid_Date[Rent$ID==i & Rent$Invoice ==j])
    
      }
    }
    
    Rent$Paid_dt <- as.Date(Rent$Paid_dt ,origin = "1970-01-01") # converting into date format
    
    Rent1 <- Rent[, unique(c("ID", "Invoice", "Payment_", "Paid_dt"))]
    
    print (Rent1)
    
        ID  Invoice Payment_    Paid_dt
    1 lucy 7/1/2018      250 2018-01-10
    2 lucy 7/1/2018      250 2018-01-10
    3 lucy 8/1/2018      100 2018-01-11
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 2019-01-17
      相关资源
      最近更新 更多