如何在r中的日期之间查找值

时间:2013-12-12 15:34:55

标签: r

下表是参考表。列a(最左列)表示开始日期。列b(中间列)表示结束日期。列d(最右列)表示"唯一值"对应于左侧的每个时间段。

     a        b  d
1/1/07   1/1/08  a
1/1/08   1/1/09  b
1/1/09   1/1/10  c
1/1/10   1/1/11  d
1/1/11   1/1/12  e

使用上表我有一个日期列表(如下所示)。我想填充"独特的价值观"与下面的日期相对应。如果下面的日期落在上面参考表中的两个日期之间,那么"唯一值"在下面标识并填充。列e是输入。列f是输出

     e   f  
2/2/09   c  
8/8/07   a  
8/7/10   d  
1/1/11   e

我可以使用vlookups,min和数组函数在excel中进行计算。但我不知道如何在r中做到这一点。

我尝试使用合并功能,但似乎需要完全匹配。我也尝试了以下代码而没有成功

Ifelse ( e >= x$a & e < x$b, d, "")

x是包含列a,b,d的数据框的名称。仅供参考,日期格式化为在r中使用并转换为数字。

谢谢

2 个答案:

答案 0 :(得分:1)

使用sqldf包:

library(sqldf)

#reference data
df1 <- read.table(text="
a        b  d
1/1/07   1/1/08  a
1/1/08   1/1/09  b
1/1/09   1/1/10  c
1/1/10   1/1/11  d
1/1/11   1/1/12  e", header=TRUE, as.is=TRUE)

#data
df2 <- read.table(text="
e
2/2/09
8/8/07
8/7/10
1/1/11", header=TRUE, as.is=TRUE)

#convert to numeric
df1$a <- as.numeric(as.Date(df1$a,format="%d/%m/%y"))
df1$b <- as.numeric(as.Date(df1$b,format="%d/%m/%y"))
df2$e <- as.numeric(as.Date(df2$e,format="%d/%m/%y"))

#data
df1
#       a     b d
# 1 13514 13879 a
# 2 13879 14245 b
# 3 14245 14610 c
# 4 14610 14975 d
# 5 14975 15340 e

df2
#       e
# 1 14277
# 2 13733
# 3 14798
# 4 14975

#output
sqldf("select e,d
      from df1, df2
      where df2.e >= df1.a and df2.e < df1.b")
#       e d
# 1 13733 a
# 2 14277 c
# 3 14798 d
# 4 14975 e

答案 1 :(得分:0)

以下是循环的答案(正如大家指出的那样,你应该首先得到这个部分)因此我在本例中使用了循环。在这里,我在d1和d2个月中生成日期,并将您感兴趣的相应日期按周计算为e。然后在f中创建一些随机数并检查哪些符合critera。

d1 <- seq(from=as.Date('2013-01-01'), to=as.Date('2013-11-12'), by='months')
d2 <- seq(from=as.Date('2013-02-01'), to=as.Date('2013-12-12'), by='months')
e <- seq(from=as.Date('2013-01-01'), to=as.Date('2013-12-13'), by='weeks')

f <- runif(length(e), 1, 10)

output <- NULL
i <- 1
j <- 1
while (i <= length(e) & j <= length(d1))
{
  if (e[i] >= d1[j] & e[i] <= d2[j])
  {
    output[i] <- f[i]
    i <- i + 1
  }
  else 
  {
    j <- j + 1
  }
}
output