Я работал над проблемой, где у меня было две переменные группировки и одно значение. Я только для того, чтобы в строках было не менее двух значений в группе, близких по значению друг к другу. В примере я хотел, чтобы группы имели один набор значений в пределах 10 друг от друга.
Ниже я сначала попробовал, и кое-что о создании переменной флага заставило меня почувствовать, что я делал это каким-то окольным путем, и я просто хотел узнать, есть ли более понятный, более намеченный способ сделать что-то подобное в data.table. Спасибо!
X и y - категории, z - значение.
library(data.table)
set.seed(123)
dt <- data.table(
x = sample(LETTERS, 1000, T),
y = sample(letters, 1000, T),
z = sample(100, 1000, T),
key = tail(letters, 3)
)
dt <- unique(dt)
dt <- dt[dt[, .(flag = any(diff(z) <= 11)), .(x, y)], on = c("x", "y")][(flag)]
dt[, flag := NULL]
dt
2 ответа
Ты мог бы сделать
res <- dt[, if (.N > 1L && min(diff(z)) <= 11) .SD, by=.(x, y)]
Я использовал min
вместо any
, так как, я думаю, это приводит к меньшему количеству вычислений.
Я добавил условие .N > 1L
, так как вам нужно подумать о том, как обрабатывать однострочный случай (где diff - это NA). Вы могли бы сделать
.N > 1L &&
отбросить эти дела.N == 1L ||
чтобы оставить их
Я просто хотел узнать, есть ли более понятный способ сделать что-то подобное в data.table
Я думаю, having=
синтаксис был бы удобен для этого. В настоящее время это запрос функции.
Входные данные (так как OP перезаписывает их):
library(data.table)
set.seed(123)
dt <- data.table(
x = sample(LETTERS, 1000, T),
y = sample(letters, 1000, T),
z = sample(100, 1000, T),
key = tail(letters, 3)
)
dt <- unique(dt)
Вы можете использовать .I
с if
, чтобы определить, включать ли каждую группу (здесь want
соответствует вашему окончательному dt
)
dt <- unique(dt)
want <- dt[dt[, if(any(diff(z) <= 11)) .I, .(x, y)]$V1]
Похожие вопросы
Новые вопросы
r
R — это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, используйте минимально воспроизводимые примеры, которые другие могут запустить с помощью копирования и вставки. Показать желаемый результат полностью. Используйте dput() для данных и укажите все небазовые пакеты с помощью library(). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. Для вопросов по статистике используйте https://stats.stackexchange.com.