#r #data.table
#r #data.table
Вопрос:
dt = data.table( v = rnorm(40) , g = rep(c("a","b"),20) )
> head(dt)
v g 1: 0.5331207 a 2: -1.1228596 b 3: -0.5366661 a 4: -0.3221877 b 5: 0.1945076 a 6: -0.6483930 b
Я хочу выполнить оценку плотности ядра для каждой группы и сохранить результат в новой data.table
. Таким образом, функция, выполняемая для каждой группы data.table
, сама вернет matrix
или data.table
Неудачные попытки:
dt[, .( { tmp = density(x=v) ; list(x=tmp$x,y=tmp$x) } ) , by = .(g) ]
dt[, .( { tmp = density(x=v) ; data.table(x=tmp$x,y=tmp$x) } ) , by = .(g) ]
Желаемый результат:
> x y g > -0.5 0.003 a > -0.45 0.0413 a ... > 0.8 0.0013 a ... > -0.5 0.0026 b > -0.45 0.0034 b ...
Комментарии:
1. Если вы удалите
.()
из первой строки кода, вы получите желаемый результат. В data.table.
это просто псевдоним дляlist
, поэтому в этом коде вы действительно делаетеlist(list(tmp$x, tmp$y))
, т. Е. создаете один столбец, содержащий список, в то время как желаемый результат — это результатlist(tmp$x, tmp$y)
, т. е. создаете два столбца, каждый из которых содержит цифры.2. Более короткий способ:
dt[, density(x=v)[c("x","y")], by=g]
3. используйте
set.seed
при приведении примера сrnorm