2013-12-12 44 views
1

下表是參考表。列a(最左列)表示開始日期。 b欄(中間欄)代表結束日期。列d(最右邊的列)表示與左側的每個時間段對應的「唯一值」。如何在r中查找日期之間的值

 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

可以使用內'%%'和'as.period'從'lubridate'包這一點。但是我發現,執行你所建議的比較很簡單。 – Justin

+1

也許你會發現[這個問題/答案](http://stackoverflow.com/questions/13911141/indexing-dataframe-by-date-interval)有用。在你的情況下,你甚至不需要用'format'來包裝。 – plannapus

+1

您發現不成功的代碼有'ifelse'拼寫錯誤。如果你沒有正確拼寫功能,你不會在R中走得太遠。 –

回答

0

這裏是一個循環的答案(如人指出你應該得到這部分先權),因此我用循環的這個例子。在這裏,我生成了幾個月的日期d1和d2以及您感興趣的相應日期,以星期爲e。然後在f中創建了一些隨機數,並檢查哪些符合標準。

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 
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 
+0

這太好了。謝謝 – user3063214

相關問題