Поднаборы строк, которые представляют собой + - N записей из совпадения в списке - PullRequest
1 голос
/ 27 июля 2011

У меня есть таблица данных (dt) со столбцом datetime. У меня также есть отдельный список datetime (L).

Как я могу вернуть подмножество dt, содержащее +/- N строк для каждого совпадения элемента в L со столбцом datetime dt?

Я заинтересован в том, чтобы сделать это как можно более обобщенно, так что этот случай является датой-временем, но мне также было бы интересно сделать это для факторов и целых чисел. В идеале это также исключает дублирование.

По сути это будет что-то вроде grep 'foo|foo1' -A10 -B10, что переводится как «Показать строки, которые соответствуют foo или foo1, включая 10 строк до и после».

Ответы [ 2 ]

4 голосов
/ 27 июля 2011

в качестве примера

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,]
2 голосов
/ 27 июля 2011

Трудно дать точный код, не видя ваших данных, но вы, вероятно, хотите использовать %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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...