查找基于多个列

时间:2017-10-28 14:45:54

标签: r lookup

我有一个看起来像这样的数据框(当然它更大):

> df1
# A tibble: 10 x 4
    index1 index2      date1      date2
     <int>  <int>     <date>     <date>
 1 5800032      6 2012-07-02 2013-09-18
 2 5800032      7 2013-09-18 1970-01-01
 3 5800254      6 2013-01-04 1970-01-01
 4 5800261      5 2012-01-23 2013-02-11
 5 5800261      6 2013-02-11 2014-02-05
 6 5800261      7 2014-02-05 1970-01-01
 7 3002704      7 2012-01-23 1970-01-01
 8 3002728      7 2012-10-20 1970-01-01
 9 3002810      7 2012-07-18 1970-01-01
10 8504593      3 2012-01-11 1970-01-01

原始变量为:index1index2date1。有一个或多个具有相同index1值的记录(其序列由index2确定)。我的目标是为date1的相同值过滤index1的后续值之间的间隔。这意味着必须至少有两个具有相同index1值的记录才能创建间隔 所以我创建了date2变量,它提供了从date1开始的间隔的结束日期。这简单地等于后续记录date1date2[n] = date1[n+1])。如果date1[n]是给定index1值的最新(或唯一)日期,则为date2[n] <- 0

我无法提出更好的想法,而不是按dfindex1排序index2并运行for循环:

for (i in 1:(nrow(df1)-1)){
  if (df1$index1[i] == df1$index1[i+1]){
    df1$date2[i] <- df1$date1[i+1]
  }
  else{df1$date2[i] <- 0}
}

它有点奏效,但它显然很慢,并且由于某种原因它没有找到&#34;它应该拥有的所有价值。此外,我确信必须有更智能的方式来完成这项任务 - 可能还有sapply功能。任何想法都表示赞赏!

1 个答案:

答案 0 :(得分:0)

您可以使用dplyr

中的延迟创建date2
    df1 %>% 
    group_by(index1) %>% 
    arrange(index2) %>%
    mutate(date2 = lag(date1, default=0))

我没有清楚地理解你问题的过滤部分。您的问题可能与默认日期(1970-01-01)(值=零)

上的过滤有关