Я хотел бы применить функцию по группе, которая назначает интервал, к которому относится наблюдение, на основе значений в этой группе новой переменной.Мне кажется, что следующий код должен работать, но, похоже, он использует весь набор данных, а не максимальный и минимальный значения для группы.Чего мне не хватает?
#require(data.table)
#fake data
set.seed(12345)
df1 <- data.frame(id_f=c(rep("a a",100),rep("b b",100),rep("c c",100)),
L=c(abs(rnorm(100,50,20)),abs(rnorm(100,90,20)),abs(rnorm(100,220,20))),
w=abs(rnorm(300,6,3)))
dt2 = as.data.table(df1)
#the offending data.table function
dt2[,"bins":= findInterval(L, c((max(L)-min(L))/10*c(1:9)),left.open=T)+1, by=id_f]
РЕДАКТИРОВАТЬ:
В столбце "aa" будет 10 одинаково разнесенных интервалов по всему диапазону "aa", и номер ячейки будет назначен дляКаждое из исходных наблюдений, так как реальные данные имеют 6000 наблюдений, в каждой ячейке есть несколько членов.Таким образом, результат будет примерно таким: (ради краткости это пример с тремя интервалами)
id_f L w bins
a a 1 1.0 1
a a 2 1.1 2
a a 3 5.0 3
b b 3 2.0 1
b b 6 3.5 2
b b 9 7.0 3
c c 10 1.0 1
c c 15 1.5 2
c c 20 6.0 3
Я бы подумал, что мой вызов findInterval
достиг бы этого, но ясно, что этовзятие min
и max
из глобального набора данных, а не только из группы.Как заставить его получить min
и max
из группы, а затем использовать его для вычисления интервала, используемого для этой группы?