首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R Dataframe :日期范围操作--将属于特定日期范围的行进行子集

R Dataframe :日期范围操作--将属于特定日期范围的行进行子集
EN

Stack Overflow用户
提问于 2014-12-16 06:00:00
回答 2查看 145关注 0票数 0

如果你看到我的个人资料,我所有的问题都在数据表上,这是另一个!

我有一个特定的数据,它是借方交易和信用交易合并的结果

代码语言:javascript
复制
>head(allTxns)
   Cust_no    CreditDate   Credit     DebitDate   Debit
 1  12345     2014-10-01    200      2014-10-03    400
 2  12345     2014-10-01    200      2014-10-04    150
 3  12345     2014-10-01    200      2014-10-15    800     
 4  33344     2014-10-03    500      2014-10-04    50
 5  33344     2014-10-03    500      2014-10-05    504
 6  33344     2014-10-03    500      2014-10-06    332
 7  33344     2014-10-03    500      2014-10-08    56
 8  66554     2014-10-10    660      2014-10-04    150     
 9  66554     2014-10-10    660      2014-10-05    800
10  66554     2014-10-10    660      2014-10-11    400
11  66554     2014-10-10    660      2014-10-12    150
12  66554     2014-10-10    660      2014-10-13    800

我的目标是获取这些行,其中DebitDate位于CreditDate的5天之间,因此我尝试对数据进行子集,其中我使用:运算符放置日期范围。

代码语言:javascript
复制
FiveDays <- allTxns$CreditDate+5 #Results in a vector which has date + 5 days

allTxns <- cbind(allTxns[1:2],FiveDays,allTxns[4:6]) #Adding the vector as a column of dataframe

newDf <- allTxns[allTxns$DebitDate %in% allTxns$CreditDate:allTxns$FiveDays]

在上面的代码中,我得到以下逻辑错误,其中只使用第一个元素

代码语言:javascript
复制
Warning messages:
  1: In mer32$DepositDate:mer32$FiveDays2 :
      numerical expression has 3994 elements: only the first used
  2: In mer32$DepositDate:mer32$FiveDays2 :
      numerical expression has 3994 elements: only the first used

因此,我所需的输出仅限于第一个Cust_no (12345),而不应用于其他行。如何确保范围条件应用于所有行??

不正确输出

代码语言:javascript
复制
 >head(newDf)
 row.names  Cust_no    CreditDate   Credit     DebitDate   Debit
     1      12345     2014-10-01    200      2014-10-03    400
     2      12345     2014-10-01    200      2014-10-04    150
     4      33344     2014-10-03    500      2014-10-04    50
     5      33344     2014-10-03    500      2014-10-05    504
     6      33344     2014-10-03    500      2014-10-06    332
     7      33344     2014-10-03    500      2014-10-08    56
     8      66554     2014-10-10    660      2014-10-04    150     
     9      66554     2014-10-10    660      2014-10-05    800
    10      66554     2014-10-10    660      2014-10-11    400
    11      66554     2014-10-10    660      2014-10-12    150
    12      66554     2014-10-10    660      2014-10-13    800

正确输出

代码语言:javascript
复制
 >head(newDf)
 row.names  Cust_no    CreditDate   Credit     DebitDate   Debit
     1      12345     2014-10-01    200      2014-10-03    400
     2      12345     2014-10-01    200      2014-10-04    150
     4      33344     2014-10-03    500      2014-10-04    50
     5      33344     2014-10-03    500      2014-10-05    504
     6      33344     2014-10-03    500      2014-10-06    332
     7      33344     2014-10-03    500      2014-10-08    56         
    10      66554     2014-10-10    660      2014-10-11    400
    11      66554     2014-10-10    660      2014-10-12    150
    12      66554     2014-10-10    660      2014-10-13    800
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-16 06:09:47

试一试

代码语言:javascript
复制
 allTxns[with(allTxns , CreditDate < DebitDate & DebitDate <=FiveDays),]
 #    Cust_no CreditDate   FiveDays Credit  DebitDate Debit
 #1    12345 2014-10-01 2014-10-06    200 2014-10-03   400
 #2    12345 2014-10-01 2014-10-06    200 2014-10-04   150
 #4    33344 2014-10-03 2014-10-08    500 2014-10-04    50
 #5    33344 2014-10-03 2014-10-08    500 2014-10-05   504
 #6    33344 2014-10-03 2014-10-08    500 2014-10-06   332
 #7    33344 2014-10-03 2014-10-08    500 2014-10-08    56
 #10   66554 2014-10-10 2014-10-15    660 2014-10-11   400
 #11   66554 2014-10-10 2014-10-15    660 2014-10-12   150
 #12   66554 2014-10-10 2014-10-15    660 2014-10-13   800
票数 1
EN

Stack Overflow用户

发布于 2017-12-08 15:21:55

这个老问题已经有了一个公认的答案。但是,我注意到问题和答案可以简化,因为没有必要创建额外的FiveDays列:

代码语言:javascript
复制
allTxns[with(allTxns, CreditDate <= DebitDate & DebitDate <= CreditDate + 5L), ]

Cust\_no CreditDate Credit DebitDate Debit 1 12345 2014-10-01 200 2014-10-03 400 2 12345 2014-10-01 200 2014-10-04 150 4 33344 2014-10-03 500 2014-10-04 50 5 33344 2014-10-03 500 2014-10-05 504 6 33344 2014-10-03 500 2014-10-06 332 7 33344 2014-10-03 500 2014-10-08 56 10 66554 2014-10-10 660 2014-10-11 400 11 66554 2014-10-10 660 2014-10-12 150 12 66554 2014-10-10 660 2014-10-13 800

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27498486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档