Давайте использовать следующий пример:
set.seed(2409)
N=5
T=10
id<- rep(LETTERS[1:N],each=T)
time<-rep(1:T, times=N)
var1<-runif(N*T,0,100)
var2<-runif(N*T,0,100)
var3<-runif(N*T,0,100)
var4<-runif(N*T,0,100)
var5<-runif(N*T,0,100)
df<-data.frame(id,time,var1,var2,var3,var4,var5); rm(N,T,id,time,var1,var2,var3,var4,var5)
Теперь я попытаюсь выполнить функцию для нескольких из этих переменных (а не всего ряда переменных!) И соответственно создать новые переменные.
У меня уже есть подходящий код для создания переменных журнала.Для этого я бы использовал следующий код:
cols <- c("var1",
"var3",
"var5")
log <- log(df[cols])
colnames(log) <- paste(colnames(log), "log", sep = "_")
df <- cbind(df,log); rm(log, cols)
Это дало бы мне дополнительные журнальные переменные.Но теперь я также хочу создать лаговые и z-преобразованные переменные.Эти функции относятся к отдельным идентификаторам.Поэтому я написал следующий код, который, конечно, работает, но он очень длинный и неэффективный в моем реальном наборе данных, где я применяю функцию к 38 переменным каждая:
library(Hmisc)
library(dplyr)
df<-df %>%
group_by(id) %>%
mutate(var1_1=Lag(var1, shift=1),
var3_1=Lag(var3, shift=1),
var5_1=Lag(var5, shift=1),
var1_2=Lag(var1, shift=2),
var3_2=Lag(var3, shift=2),
var5_2=Lag(var5, shift=2),
var1_z=scale(var1),
var3_z=scale(var3),
var5_z=scale(var5)
)
Я очень уверен, что есть и способчтобы сделать это более эффективным.Было бы желательно, если бы я мог определить исходную переменную один раз, выполнить разные функции и в результате создать новые переменные.
Большое спасибо!