data.table:将变量转换为id中的常量

时间:2015-12-06 20:48:51

标签: r data.table

假设我有以下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

我希望var1var2idyear之间保持不变,并将id内的第一个观察值替换为非常数值year

另外我想用函数做这个,并且参数可以是任何大小的向量,具体取决于我想要转换为常量的变量数。

constant <-c("var1", "var2")
id<-"id"
year<-"year"
fn_const<-function(data, id, year, constant){

}

1 个答案:

答案 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我一开始并没有真正看到将此作为一项功能的任何好处,除非您计划一遍又一遍地节省空间。