R 计算两个数据帧中日期之间的差异
下面是第一个数据帧R 计算两个数据帧中日期之间的差异,r,dataframe,R,Dataframe,下面是第一个数据帧 Account reference number Amount Date A 1 1583.51 16/05/2016 B 2 4038.18 27/09/2016 C 3 1161.36 20/05/2016 C 4 732.39 24/10/2016 C 5 747.69 24/11/2016 Account reference number Amount Date A 6 3062.88 03/05/
Account reference number Amount Date
A 1 1583.51 16/05/2016
B 2 4038.18 27/09/2016
C 3 1161.36 20/05/2016
C 4 732.39 24/10/2016
C 5 747.69 24/11/2016
Account reference number Amount Date
A 6 3062.88 03/05/2016
A 7 2619.09 03/05/2016
A 8 4743.22 09/05/2016
B 9 115.28 03/05/2016
B 10 993.14 03/05/2016
B 11 879.05 03/05/2016
C 12 50.93 03/05/2016
C 13 21.83 03/05/2016
C 14 14.55 03/05/2016
下面是第二个数据帧
Account reference number Amount Date
A 1 1583.51 16/05/2016
B 2 4038.18 27/09/2016
C 3 1161.36 20/05/2016
C 4 732.39 24/10/2016
C 5 747.69 24/11/2016
Account reference number Amount Date
A 6 3062.88 03/05/2016
A 7 2619.09 03/05/2016
A 8 4743.22 09/05/2016
B 9 115.28 03/05/2016
B 10 993.14 03/05/2016
B 11 879.05 03/05/2016
C 12 50.93 03/05/2016
C 13 21.83 03/05/2016
C 14 14.55 03/05/2016
我想通过比较两个数据帧来找出每个帐户的日期差异。
例如,如果您比较账户“A”数据框中的日期,则应为-13天,因为开始日期为2016年5月16日,停止日期为2016年5月3日
我希望第一个数据框中的日期与该帐户第二个数据框中的每个日期进行检查。例如,2016年5月16日应与2016年5月3日和2016年5月9日核对。创建了我自己的样本数据,因为您的样本数据很难复制。基于dplyr的解决方案:
df1 = data.frame(account=c(1,2,3,4),date=seq(Sys.Date(),Sys.Date()+3,by=1),value = c(1,1,1,1))
df2 = data.frame(account=c(1,2,3,4),date=seq(Sys.Date()+2,Sys.Date()+5,by=1), value = c(2,2,2,2))
require(dplyr)
df2 = df2 %>% select(account,df2.date=date)
df1 = df1 %>% left_join(df2) %>% mutate(diff = as.numeric(date-df2.date))
输入
输出
> df1
account date value df2.date diff
1 1 2017-07-17 1 2017-07-19 -2
2 2 2017-07-18 1 2017-07-20 -2
3 3 2017-07-19 1 2017-07-21 -2
4 4 2017-07-20 1 2017-07-22 -2
希望这有帮助 为简单起见,我假设第一个日期框称为a,第二个日期框称为b。 我用缩写的形式创建了它们
a <- data.frame(Account = c("A,B"), reference_number = c(1,2), Amount = c(1583.51,4038.18), Date = c("16/05/2016","27/09/2016"))
b <- data.frame(Account = c("A,A"), reference_number = c(6,7), Amount = c(3062.88,2619.09), Date = c("03/05/2016","03/05/2016"))
根据Florian的回答使用样本数据:
df1 = data.frame(account=c("A","A","B","B"),date=seq(Sys.Date(),Sys.Date()+3,by=1),value = c(1,1,1,1))
df2 = data.frame(account=c("A","A","A","B"),date=seq(Sys.Date()+2,Sys.Date()+5,by=1),value = c(2,2,2,2))
我在每个数据帧中添加了每个帐户的多个实例。这对于为您自己的数据获得正确的输出非常重要:
library(dplyr)
library(lubridate)
full_join(df1,df2,by="account") %>%
mutate(diff=date.x-date.y) %>%
account date.x value.x date.y value.y diff
1 A 2017-07-17 1 2017-07-19 2 -2 days
2 A 2017-07-17 1 2017-07-20 2 -3 days
3 A 2017-07-17 1 2017-07-21 2 -4 days
4 A 2017-07-18 1 2017-07-19 2 -1 days
5 A 2017-07-18 1 2017-07-20 2 -2 days
6 A 2017-07-18 1 2017-07-21 2 -3 days
7 B 2017-07-19 1 2017-07-22 2 -3 days
8 B 2017-07-20 1 2017-07-22 2 -2 days
您是否尝试过合并和减法?在帐户C
的情况下会发生什么?第一个数据框中有3个日期,第二个数据框中有3个日期…这是9个总比较吗?您能提供您想要的输出吗?谢谢Masoud。请参阅下面的输出。A 1-13天A 7-13天A 8-7天B 9-147天B 10-147天B 11-147days@user8320197看起来你在下面收到了很多答案。如果其中任何一个解决了你的问题,请考虑接受它作为一个答案,点击左边的检查标记。这让社区知道答案帮助您解决了问题。非常感谢,但我希望第一个数据框中的日期与该帐户第二个数据框中的每个日期进行检查。如果您在我2016年5月16日的问题中考虑到A,请与2016年5月3日和2016年5月9日核对。哦,我明白了。从你原来的帖子上看不清楚。(你应该更新你的帖子来表明这一点…)这让事情变得复杂。在科目C
的情况下会发生什么?您在第一个数据框中有3个日期,在第二个数据框中有3个日期……这是9个总比较吗?对于账户C,2016年5月20日应与2016年5月3日进行三次核对,2016年10月24日应与2016年5月3日核对三次,2016年11月24日应与2016年5月3日核对三次,因为我们对这三项交易有相同的日期。我们可以使用for循环还是嵌套for循环?