2011-07-27 23 views
1

我有一個包含datetime列的數據表(dt)。我也有一個單獨的日期列表(L)。子設置行是列表中匹配項的+ - N項

如何返回dt的一個子集,其中有+/- N行,針對L的日期時間列中的項目的每個匹配項?

我有興趣儘量做到這一點,所以這種情況是一個日期時間,但我也有興趣做它的因素和整數。理想情況下,這也會消除任何重疊。

基本上這將是類似於grep 'foo|foo1' -A10 -B10,它轉換爲「顯示與foo或foo1相匹配的行,包括10行前後」。

+1

我們可以有一些樣品數據,請在糖上面放點糖嗎? –

回答

4

這樣一個例子

dt <- data.frame (dt = 101 : 200) 
L <- c (163, 200, 131) 

那麼你匹配的行數都是

matches <- which (dt$dt %in% L) 

現在,假設你想從3行前1後:

extrarows <- -3 : 1 

現在outer是你的朋友:

rows <- outer(extrarows, matches, `+`) 

幾乎是你在找什麼,我們只是

  • 需要確認的條目都是有效的行號(有可能是負數在rows):

    rows <- rows [rows %in% seq_len (nrow (dt))]

  • 您可能還需要擺脫重複的:

    rows <- unique (rows)

  • ,如果你想保留的rows矩陣結構,無效指數可能設置爲NA是不是刪除他們更好:

    rows [! rows %in% seq_len (nrow (dt))] <- NA

現在你回到

dt [rows,] 
+0

不錯的使用'外'。在兩場比賽接近時,你需要擺脫重複。 –

+0

@cbeleites。優雅的答案。你在Rhelp的傑出工作非常典型。 –

+0

迪丁,謝謝! Richie,也可能是矩陣結構(即每個匹配的結果行​​數不變)很有用。我相應地更新了。謝謝。 – cbeleites

2

沒有看到您的數據就很難給出確切的代碼,但您可能想使用%in%來查找匹配項,例如,

match_index <- which(dt$some_column %in% L) 

現在,我編了一些數字來說明如何獲取行之前和之後的行。

match_index <- c(1, 33, 35, 50) 
n <- 55  #in practice, this will be nrow(dt) 

對於每個匹配,從10個值獲得的值的序列之前到10之後,跳過位於數據的範圍之外的數字。

all_values <- lapply(match_index, function(x) seq.int(max(1, x - 10), min(x + 10, n))) 

結合成一個單一的載體。

all_values <- do.call(c, all_values) 

刪除重複項。

all_values[!duplicated(all_values)] 
+1

還不錯!不用調用'c','unlist(all_values)'是另一種選擇。 – cbeleites

相關問題