我有一個包含datetime列的數據表(dt)。我也有一個單獨的日期列表(L)。子設置行是列表中匹配項的+ - N項
如何返回dt的一個子集,其中有+/- N行,針對L的日期時間列中的項目的每個匹配項?
我有興趣儘量做到這一點,所以這種情況是一個日期時間,但我也有興趣做它的因素和整數。理想情況下,這也會消除任何重疊。
基本上這將是類似於grep 'foo|foo1' -A10 -B10
,它轉換爲「顯示與foo或foo1相匹配的行,包括10行前後」。
我有一個包含datetime列的數據表(dt)。我也有一個單獨的日期列表(L)。子設置行是列表中匹配項的+ - N項
如何返回dt的一個子集,其中有+/- N行,針對L的日期時間列中的項目的每個匹配項?
我有興趣儘量做到這一點,所以這種情況是一個日期時間,但我也有興趣做它的因素和整數。理想情況下,這也會消除任何重疊。
基本上這將是類似於grep 'foo|foo1' -A10 -B10
,它轉換爲「顯示與foo或foo1相匹配的行,包括10行前後」。
這樣一個例子
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,]
不錯的使用'外'。在兩場比賽接近時,你需要擺脫重複。 –
@cbeleites。優雅的答案。你在Rhelp的傑出工作非常典型。 –
迪丁,謝謝! Richie,也可能是矩陣結構(即每個匹配的結果行數不變)很有用。我相應地更新了。謝謝。 – cbeleites
沒有看到您的數據就很難給出確切的代碼,但您可能想使用%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)]
還不錯!不用調用'c','unlist(all_values)'是另一種選擇。 – cbeleites
我們可以有一些樣品數據,請在糖上面放點糖嗎? –