简体   繁体   English

如何通过唯一 ID 将 R 中的列中的某些行加在一起?

[英]How to add together certain rows within a column in R by unique IDs?

I'm new and sorry if my question is badly worded.如果我的问题措辞不当,我很抱歉。

I'm working in r and I have table called Rent that might look like this:我在 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

So what I want to do is that since Lucy has two payments on 7/1/2018, I want to combine them together and then sum the payment, and use the latest Paid Date.所以我想做的是,由于 Lucy 在 2018 年 7 月 1 日有两次付款,我想将它们组合在一起,然后将付款相加,并使用最新的付款日期。

What I have so far is that到目前为止我所拥有的是

#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") 

But when I run the first line all the sum_late column is N/A.但是当我运行第一行时,所有 sum_late 列都是 N/A。 I'm not sure what I did wrong.我不确定我做错了什么。 Ideally, I would want a table just like this.理想情况下,我想要一张这样的桌子。

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

Sorry if this is a stupid question, I appreciate any help and feedback!!对不起,如果这是一个愚蠢的问题,我感谢任何帮助和反馈! Thank you all for your time!!谢谢大家的时间!!

We can change Paid_Date to date class, group_by ID and Invoice , sum Payment and select max Paid_Date .我们可以将Paid_Date更改为日期 class、 group_by IDInvoicesum Payment和 select max Paid_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

Or if you prefer data.table using the same logic.或者,如果您更喜欢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)]

data数据

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))

There are multiple ways of doing this task, I will be using for-loops for creating desired output.有多种方法可以完成此任务,我将使用 for 循环来创建所需的 output。 I echo with @Ronak Shah using dplyr method which make lesser processing time thank using for-loops我使用 dplyr 方法与@Ronak Shah 相呼应,这使得处理时间更短,感谢使用 for 循环

Data数据

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))

Converting Paid_date into date formats将支付日期转换为日期格式

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

For-loops 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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM