![](/img/trans.png)
[英]how to conditionally create new column based on the values of a column in one dataframe and the column header names of another dataframe in R
[英]Create a column in one dataframe based on another column in another dataframe in R
我對 R 和 DPLYR 相當陌生,我被困在這個問題上:
我有兩張桌子:
(一)汽車維修
(2) 每輛車的欠款隨着時間的推移
我想做的是在維修表上創建三個額外的列,這給了我:(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))
使用zoo
for year-month 和tidyverse
,您可以嘗試以下操作。 使用left_join
將所有df_owed
數據添加到您的df_repair
數據中,按car_number
。 您可以使用zoo
將年月列轉換為yearmon
對象。 然后,按df_owed
中的年月列對行進行排序。
對於每個unique_id
(使用group_by
),您可以創建您感興趣的三列。 第一個將使用最新的amount_owed
,其中欠款日期早於服務日期。 然后第二個(3 個月)將使用第一個amount_owed
值,其中欠款日期比服務日期晚 3 個月(3/12)。 最后,最近的只是從amount_owed
中獲取的last
值。
使用示例數據,結果略有不同,可能是由於數據幀與帖子中的圖像不匹配。
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)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.