Мои данные состоят из набора наблюдений, сделанных в разных группах. Для каждой группы имеется разное количество наблюдений. Я хотел бы создать переменную, которая помечает наблюдение цифрой «1» для дальнейшего ручного контроля качества/контроля качества. Флаги должны располагаться через равные промежутки внутри группы, но этот интервал может различаться между двумя группами. Интервал получается путем деления длины каждой группы на константу (5 в этом примере).
Данные будут выглядеть примерно так:
dt<-data.table(places=c(rep("A",10), rep("B",20))) #the data
dt2<-data.table(places=c("A","B"), spacing=c(2,4)) #the spacings by group to apply to the data
Затем применяется некоторый код для создания маркировки (или последовательности)
dt$sequence<- ????
Выглядит так:
places sequence
A 1
A
A 1
A
...
B 1
B
B
B
По сути, я хочу, чтобы каждая группа "отсчитывалась" на основе идеального интервала, который был определен для этой группы, и сохраняла только "1" каждый раз, когда подсчет повторяется. Я просто не уверен, как передать data.table эту комбинацию интервалов и групп.
Это просто с
dplyr
, но мне любопытно, какие точные правила вы используете для определения интервала. Если длина столбца не делится на соответствующееspacing
, вы хотите округлить до ближайшего целого числа или округлить до ближайшего целого числа... или что-то еще? Не могли бы вы предоставить функциюf <- function(col_length, spacing_divisor){...}
, чтобы точно определить ваше намерение?Конечно,
f<-function(col_length){floor(col_length/5}
Решение dplyr будет интересно посмотреть, но меня действительно интересует решение data.table.Спасибо! Сразу придет ответ!
Я должен отметить, что в вашем примере выходные данные показывают, что
1
встречается каждые 2 строки для"A"
, а не один раз в начале и один раз на полпути... чтоf
предоставило бы при наличии2
и попросили разделить группу на 2 равные части.хм не вижу проблемы. Я представлял, как моя функция применяется группой. Я понял, что мое решение проще, чем я его делал. Смотри ниже.