Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于R中另一个数据帧中的另一列,在一个数据帧中创建一列_R_Dplyr_Tidyverse - Fatal编程技术网

基于R中另一个数据帧中的另一列,在一个数据帧中创建一列

基于R中另一个数据帧中的另一列,在一个数据帧中创建一列,r,dplyr,tidyverse,R,Dplyr,Tidyverse,我对R和DPLYR是相当陌生的,在这个问题上我陷入了困境: 我有两张桌子: (1) 汽车修理 (2) 一段时间内每辆车的欠款 我想做的是在repair表上创建三个额外的列,这些列提供: (1) 汽车修理时的欠款, (2) 3个月后的路和 (3) 最后一次付款记录存档 如果维修日期与任何付款记录不匹配,我需要使用记录中最接近的欠款金额 比如: 你知道我该怎么做吗 以下是数据帧: 汽车修理: df_repair <- data.frame(unique_id = c("A

我对R和DPLYR是相当陌生的,在这个问题上我陷入了困境:

我有两张桌子:

(1) 汽车修理

(2) 一段时间内每辆车的欠款

我想做的是在repair表上创建三个额外的列,这些列提供: (1) 汽车修理时的欠款, (2) 3个月后的路和 (3) 最后一次付款记录存档

如果维修日期与任何付款记录不匹配,我需要使用记录中最接近的欠款金额

比如:

你知道我该怎么做吗

以下是数据帧:

汽车修理:

 df_repair <- data.frame(unique_id = 
 c("A1","A2","A3","A4","A5","A6","A7","A8"),
 car_number = c(1,1,1,2,2,2,3,3),
 repair_done = c("Front Fender","Front 
 Lights","Rear Lights","Front Fender", "Rear Fender","Rear Lights","Front 
 Lights","Front Fender"),
 YearMonth = c("2014-03","2016-03","2016-07","2015-05","2015-08","2016-01","2018-01","2018-05"))


df_owed <- data.frame(car_number = c(1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,3),
                      YearMonth = c("2014-02","2014-05","2014-06","2014-08","2015-06","2015-12","2016-03","2016-04","2016-05","2016-06","2016-07","2016-08","2015-05","2015-08","2015-12","2016-03","2018-01","2018-02","2018-03","2018-04","2018-05","2018-09"),

amount_owed = c(20000,18000,17500,16000,10000,7000,6000,5500,5000,4500,4000,3000,10000,8000,6000,0,50000,40000,35000,30000,25000,15000))

df_repair使用
zoo
年-月和
tidyverse
,您可以尝试以下方法。使用
left\u join
将所有
df\u欠下的
数据添加到
df\u维修
数据中,按
车号添加。您可以使用
zoo
将年-月列转换为
yearmon
对象。然后,从
df\u
中按年-月列对行进行排序

对于每个
唯一的\u id
(使用
group\u by
),您可以创建感兴趣的三列。第一个将使用最新的
欠款金额
,其中欠款日期早于服务日期。然后,第二个(3个月)将使用第一个
欠款
值,其中欠款日期在服务日期之后3个月(3/12)。最后,最近一次只取
所欠金额
中的
最后一次

使用示例数据,结果略有不同,可能是因为数据帧与文章中的图像不匹配

library(tidyverse)
library(zoo)

df_repair %>%
  left_join(df_owed, by = "car_number") %>%
  mutate_at(c("YearMonth.x", "YearMonth.y"), as.yearmon) %>%
  arrange(YearMonth.y) %>%
  group_by(unique_id, car_number) %>%
  summarise(
    owed_repair_done = last(amount_owed[YearMonth.y <= YearMonth.x]),
    owed_3_months = first(amount_owed[YearMonth.y >= YearMonth.x + 3/12]),
    owed_most_recent = last(amount_owed)
  )
库(tidyverse)
图书馆(动物园)
df_维修%>%
左连接(df\u欠,by=“car\u number”)%>%
在(c(“YearMonth.x”、“YearMonth.y”)、as.yearmon%%>处突变_
安排(年月日)%>%
分组依据(唯一id、车号)%>%
总结(
欠下的修理费=最后一次(欠下的金额[年月.y=年月.x+3/12]),
欠的最近金额=上次(欠的金额)
)

@akrun感谢您的及时回复。缺少了一些逗号,现在应该可以用了