假设我有以下data.table
:
dat <- data.table("id"=c(1,1,1,1,2,2,2,2), "year"=c(1,1,2,2,1,1,2,2),
"var1"=c(4,4,4,4,5,5,5,4), "var2"=c(4,4,4,3,5,5,5,4))
id year var1 var2
1: 1 1 4 4
2: 1 1 4 4
3: 1 2 4 4
4: 1 2 4 3
5: 2 1 5 5
6: 2 1 5 5
7: 2 2 5 5
8: 2 2 4 4
我希望var1
和var2
在id
和year
之间保持不变,并将id
内的第一个观察值替换为非常数值year
。
另外我想用函数做这个,并且参数可以是任何大小的向量,具体取决于我想要转换为常量的变量数。
constant <-c("var1", "var2")
id<-"id"
year<-"year"
fn_const<-function(data, id, year, constant){
}
答案 0 :(得分:2)
我认为这就是你想要的:
dat[ , `:=`(var1 = var[1L], var2 = var2[1L]), by = .(id, year)]
作为一项功能,您必须执行以下操作:
fn_const <- function(data, id, year, constant){
data[ , (constant) := .SD[1L], by = c(id, year), .SDcols = constant]
data
}
请注意,这不会分配给dat
,因此您必须使用类似dat <- fn_const(...)
的内容,这可能并不理想(制作副本)。相反,为什么不将data
作为参数消除:
fn_const<-function(id, year, constant){
dat[ , (constant) := .SD[1L], by = c(id, year), .SDcols = constant]
}
现在只需运行fn_const(id, year, constant)
即可constant
引用dat
而无需复制。
TBH我一开始并没有真正看到将此作为一项功能的任何好处,除非您计划一遍又一遍地节省空间。