2017-08-14 33 views
1

編輯:找出差距在時間數據

我發現下面的問題的方法,但是,它適用於小數據集,但仍對大數據集創建falses輸出。有人知道爲什麼嗎?我找不到這個錯誤。下面的代碼:

df$continuous <- 
    unlist(lapply(split(df, df$ID), 
       function(x) { 
        sapply(1:nrow(x), 
         function(y) { 
          any(x$start[y] - x$end[-(y:NROW(x$end))] <= 1) 
         }) 
       })) 

原來的問題: 我工作的一個函數在一系列的開始/結束日期的標識差距。如果開始日期晚於先前結束日期之後的1天開始,則輸出應該爲FALSE。

DATA:

df <- data.frame('ID' = c('1','1','1','1','1','1'), 'start' = as.Date(c('2010-01-01', '2010-01-03', '2010-01-05', '2010-01-09','2010-02-01', '2010-02-10')), 
       'end' = as.Date(c('2010-01-03', '2010-01-22', '2010-01-07', '2010-01-12', '2010-02-10', '2010-02-12'))) 

這是我嘗試用x = starty = end來解決這個問題:

my_fun <- function(x,y){ 
    any(x[i] - y[1:NROW(i)-1] <= 1) 
} 

它運作良好,如果我指定i,但我不設法包裝成這樣循環。最終,這個函數應該以dplyr的方式應用於大數據集中的組。

這是它應該是什麼樣子:

ID  start  end continuous 
1 1 2010-01-01 2010-01-03 FALSE #or TRUE 
2 1 2010-01-03 2010-01-22 TRUE 
3 1 2010-01-05 2010-01-07 TRUE 
4 1 2010-01-09 2010-01-12 TRUE 
5 1 2010-02-01 2010-02-10 FALSE 
6 1 2010-02-10 2010-02-12 TRUE #according to my function or FALSE compared to start[1] would be even better 

我倒是很欣賞一些幫助與此有關。

回答

0

編輯:我只是重新讀你的問題......而你想比較開始與所有結束日期。然後嘗試使用功能expand.grid

df <- data.frame('ID' = c('1','1','1','1','1','1'), 'start' = as.Date(c('2010-01-01', '2010-01-03', '2010-01-05', '2010-01-09','2010-02-01', '2010-02-10')), 
       'end' = as.Date(c('2010-01-03', '2010-01-22', '2010-01-07', '2010-01-12', '2010-02-10', '2010-02-12'))) 

df_expand <- as.data.table(expand.grid(df$start,df$end)) 

這就造成我們定義什麼是可以接受的開始/結束

names(df_expand) = c("start","end") 
df_expand[,ID:= 1] 
df_expand[,diff_days := difftime(end,start,unit = "days")] 
df_expand[,acceptable := any(diff_days<1), by = start] 

之間。這裏所有的組合..

df = merge(df,df_expand,by = c("start","end","ID"),all.x=TRUE) 

我想。 。我們可能想保留原始數據,所以我們將它合併回來並縮小我們擁有的信息。

等等..你能提供一個你期待什麼和需要什麼的適當例子嗎?我剛剛讀了你的其他評論,現在它讓我困惑......

+0

是的,只是編輯我的問題。 – ceefel

1

你可以使用dplyrlubridate來做到這一點。 dplyr非常有用window functionslag()這對於這種類型的分析很方便。

library(tidyverse) 
library(lubridate) 

df %>% 
    mutate(start - lag(end, 1) == 0) 

# ID  start  end start - lag(end, 1) == 0 
# 1 1 2010-01-01 2010-01-03      NA 
# 2 1 2010-01-03 2010-01-22      TRUE 
# 3 1 2010-01-05 2010-01-07     FALSE 
# 4 1 2010-01-09 2010-01-12     FALSE 
# 5 1 2010-02-01 2010-02-10     FALSE 
# 6 1 2010-02-10 2010-02-12      TRUE 

你想如何處理你的第一行數據?由於沒有以前的值,因此顯示NA。這通常是你應該如何處理這種情況,但如果你希望它有不同的價值,我可以編輯我的答案。

+0

我之前也嘗試過這種方法,但是,我需要將開始日期T與此點之前的所有結束日期進行比較的解決方案。所以像這樣:'start [4] - end [1:3]'因此滯後函數是不夠的。 – ceefel

+0

@ceefel你可以安排數據,然後使用'lag()'或者是否存在行重疊期? –

+0

正確,期間重疊。開始[1]直到結束[4]實際上是一個週期。所以開始[5]應該返回FALSE – ceefel