下表是参考表。列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中使用并转换为数字。
谢谢
答案 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