Я пытаюсь протестировать различные условия в таблице data.table, которая выглядит как этот воспроизводимый пример.
set.seed(17)
year <- 1980 + rnbinom(10000,3,0.35)
event <- rep(LETTERS, length.out=10000)
z <- as.integer(runif(10000,min = 0, max = 10))
dt <- data.table(event,year,z)
setkey(dt, event,year)
dt <- dt[,sum(z), by=c("event","year")]
V1
(который появляется из последней команды) представляет собой количество произошедших событий.
Итак, таблица данных представляет собой упорядоченный массив, и мне нужно выполнить с ним множество функций. Вот некоторые примеры:
Как рассчитать скользящую сумму (или скользящее среднее) событий за 10 предшествующих лет для каждого события? Таким образом, для A 1990 желаемый результат равен 1,452 (между 1980 и 1989 годами). Для H 2012 выходное значение равно 11, потому что с 2002 по 2011 год произошло только 11 случаев (3 в 2002 году, 3 в 2007 году и 5 в 2010 году). Для A 1983 результат будет:
NA
.Как я могу проверить, произошло ли событие как минимум в 12 из 15 предыдущих лет? Таким образом, для A 1997 мы можем видеть, что событие произошло более чем за 12 лет за 15 лет до этого (1982–1996 гг., Оно происходило каждый год, кроме 1996 г.), таким образом, критерий соответствует strong >. Однако для A 2001 мы видим, что событие происходит только в 11 из 15 предшествующих лет (1986–2000), а не в 1996, 1998, 1999 и 2000 годах) критерий не встретил. Здесь желательным результатом будет дискретная 1 (критерий соблюден) или 0 (критерий не соблюден).
В идеале код должен позволять вычислять как 1, так и 2 не только для years
, которые встречаются в data.table
, но также для отсутствующих между 1980 и 2013 годами. Итак, для K 2005 мы можем рассчитать результат для первого квартала как 25 (13 + 5 + 3 + 3 + 2) (спасибо @Arun за указание на предыдущую ошибку). Для 2-го квартала мы видим, что событие не произошло в 1999,2000,2001,2003 годах, и в 2004 году, следовательно, критерий «по крайней мере через 12 из 15 лет» не выполняется. Кроме того, возможно, что комбинация событие-год существует в таблице data.table, но V1 имеет значение 0 (см. Строку 18, A 2001). В идеале такие нулевые вхождения должны рассматриваться как ненулевые (например, путем удаления всех строк, для которых V1 равен нулю).
Я знаю, что нечасто задавать два вопроса, но я чувствую, что они связаны друг с другом и действительно связаны с похожими проблемами. Надеюсь, кто-то может внести какие-то предложения.
Большое спасибо,
Саймон
Z, 2012
Я понимаю путаницу. У меня есть набор данных, который на самом деле относится к 2013 году и включает его. Но, как показывают фальшивые данные, частота событий резко снижается ближе к концу. Короче говоря, Z, 2012 год может существовать в моих данных и требует значения, но я не могу вернуться дальше 1980 года, поэтому каждое скользящее среднее до 1989 года не может иметь предшествующую информацию за 10 лет. (В зависимости от результатов я настрою это на 7 или 8 или, может быть, 11) ... Надеюсь, это проясняет ситуацию, и большое спасибо за ваши усилия! - person SJDS   schedule 07.05.2014