当前位置: 首页 > 知识库问答 >
问题:

使用for循环在R中按组迭代日期

湛博易
2023-03-14

我正在尝试根据“ExpectedDate”和“ObservedDate”填充“FinalDate”。

规则是:对于每个组,如果观察日期大于前一个预期日期且小于下一个预期日期,则最终日期等于观察日期,否则最终日期等于预期日期。

如何修改下面的代码以确保:

  • 最终日期按组填写
  • 迭代次数不跳过任何行
set.seed(2)
dat<-data.frame(Group=sample(LETTERS[1:10], 100, replace=TRUE), 
                Date=sample(seq(as.Date('2013/01/01'), as.Date('2020/01/01'), by="day"), 100))%>%
  mutate(ExpectedDate=Date+sample(10:200, 100, replace=TRUE),
         ObservedDate=Date+sample(10:200, 100, replace=TRUE))%>%
           group_by(Group)%>%
           arrange(Date)%>%
           mutate(n=row_number())%>%arrange(Group)%>%ungroup()%>%
  as.data.frame()

#generate some missing values in "ObservedDate"
dat[sample(nrow(dat),20), "ObservedDate"]<-NA

dat$FinalDate<-NA
for (i in 1:nrow(dat)){
  dat[i, "FinalDate"]<-if_else(!is.na(dat$"ObservedDate")[i] && 
                                 dat[i, "ObservedDate"] > dat[i-1, "ExpectedDate"] && 
                                 dat[i, "ObservedDate"] < dat[i+1, "ExpectedDate"],
                               dat[i, "ObservedDate"],
                               dat[i,"ExpectedDate"])
}
dat$FinalDate<-as.Date(dat$FinalDate) # convert numeric to Date format

例如,在下面的输出中:

当i=90时,代码在字母I中查找之前的预期日期

我们希望它只在字母J中查找ExpectedDate。如果组没有上一个预期日期,并且ObservedDate大于ExpectedDate但小于下一个expected日期,则FinalDate应填写ExpectedData。

在 i=100 时,代码生成 NA,因为没有下一个观测值可用

我们希望填写此值,以便对于每个组中的最后一个观察,如果观察日期大于组中的最后一个预期日期,则 FinalDate=ObservedDate,否则为预期日期。

    Group       Date ExpectedDate ObservedDate  n  FinalDate
88      I 2015-09-07   2015-12-05         <NA>  7 2015-12-05
89      I 2018-08-02   2018-11-01   2018-08-13  8 2018-11-01
90      J 2013-07-24   2013-08-30   2013-08-12  1 2013-08-30
91      J 2013-11-22   2014-01-02   2014-04-05  2 2014-04-05
92      J 2014-11-03   2015-03-23   2015-05-10  3 2015-05-10
93      J 2015-08-30   2015-12-09   2016-02-04  4 2016-02-04
94      J 2016-04-18   2016-09-03         <NA>  5 2016-09-03
95      J 2016-10-10   2017-01-29   2017-04-14  6 2017-04-14
96      J 2017-02-14   2017-07-05         <NA>  7 2017-07-05
97      J 2017-04-21   2017-10-01   2017-08-26  8 2017-08-26
98      J 2017-10-01   2018-01-27   2018-02-28  9 2018-02-28
99      J 2018-08-03   2019-01-31   2018-10-20 10 2018-10-20
100     J 2019-04-25   2019-06-23   2019-08-16 11       <NA>

共有1个答案

充培
2023-03-14

我们可以放开< code>for循环,在< code>dplyr中使用< code>group_by 、< code>lag和< code>lead:

library(dplyr)

dat %>%
  group_by(Group) %>%
  mutate(FinalDate = if_else(ObservedDate > lag(ExpectedDate) & 
                    ObservedDate < lead(ExpectedDate), ObservedDate, ExpectedDate)) 

我们也可以做这个数据.table::between

dat %>%
  group_by(Group) %>%
  mutate(FinalDate = if_else(data.table::between(ObservedDate, 
           lag(ExpectedDate), lead(ExpectedDate)), ObservedDate, ExpectedDate)) 
 类似资料:
  • 我正在尝试使用For循环将一个随机整数(0-2)添加到一个变量中指定的次数。我遇到的问题是,循环不是每次循环时都使用一个新的随机数,所以,如果我输入9,我只能得到0、9,或者18。 我希望一个对象返回的键“a”和“b”具有不同的数值。

  • 我是不是误解了什么?据我所知,Julia中的Dataframes与R中的Dataframes的工作方式不同,但我无法全神贯注于如何使其工作。

  • 在Django模板中,我想创建一个遍历列表的for循环。在循环过程中,我还希望能够使用循环的迭代次数。 例如,如果有4个元素,那么: 应打印以下内容: 我该怎么做呢?

  • 问题内容: 我在显示日期的django模板中有以下for循环。我想知道是否有可能在循环中迭代一个数字(在以下情况下为i)。还是我必须将其存储在数据库中,然后以days.day_number的形式查询? 问题答案: Django提供了它。你可以使用以下任一方法: 索引从1开始。 索引从0开始。 在模板中,你可以执行以下操作:

  • 在django模板中,我有以下for循环显示天数。我想知道是否有可能在循环中迭代一个数字(在下面的例子I中)。或者我必须将其存储在数据库中,然后以天的形式进行查询。第几天?

  • 本文向大家介绍为什么在JavaScript数组迭代中使用“ for…in”循环是个坏主意?,包括了为什么在JavaScript数组迭代中使用“ for…in”循环是个坏主意?的使用技巧和注意事项,需要的朋友参考一下 在大多数情况下,通常最好使用' for '循环而不是“ for ... in ”循环,因为“ for ... in ”循环会产生索引 ,而不会打扰剩余的索引普通的“ for ”循环显示