У меня есть data.frame
так:Форсирование ddply
n = 50
df = data.frame(group=sample(1:as.integer(n/2),n,replace=T),
x = runif(n),
y = runif(n),
z = runif(n))
df = df[with(df,order(group)),]
Что мне нужно сделать, для каждого уникального значения group
, чтобы произвести сегменты, то есть, где производятся новые столбцы, xend
, yend
и zend
, которые являются значениями x
, y
, z
значений предыдущей точки в этой группе. Для последнего значения в группе концы берутся как первая точка в группе.
Я могу сделать это следующим образом:
res = ddply(df,"group",function(d){
ixc = c("x","y","z")
dfE = d[,ixc]
dfE = rbind(dfE[nrow(dfE),],dfE[1:(nrow(dfE)-1),])
colnames(dfE) = paste0(ixc,"end")
cbind(d,dfE)
})
print(head(res))
Это тривиально, когда n
мала, однако, когда n
становится большой, то время для выполнения выше становится существенным, есть более быстрый способ сделайте это, возможно, используя data.table
?
Какую версию data.table вы используете, шахта версия 1.9.2, и она не содержит какой-либо функции «сдвига». –
Ошибка в '.data.table' (setDT (df),,': = '(xend, shift (x, 1L, fill = x [.N],: не удалось найти функцию« shift » –
Да, Я разработал это, версия 1.9.5 –