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

R data.table:将变量转换为id中的常量,r,data.table,R,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

假设我有以下
数据。表

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

我想这就是你想要的:

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
}
现在只需运行
fn_const(id,year,constant)
即可通过引用
dat
分配
常量,无需复制


TBH首先,我并不认为将其作为一个函数来编写有任何好处,除非您打算反复编写,否则可能会节省空间。

“任何大小的向量,取决于我要将多少变量转换为常量”,请使用ellaborate。对于您的主要任务,
dat[,`:=`(var1=var1[1],var2=var2[1]),by=(id,year)
在我的情况下,应该做些小动作。我真的有一个更大的数据和更多的变量,我想转换成常量。例如,变量可以是常数=c(“var1”、“var2”、“var10”),而不是像本例中的两个。这就是为什么我想知道如何使你给出的解决方案更具一般性。
fn_const <- function(data, id, year, constant){
  data[ , (constant) := .SD[1L], by = c(id, year), .SDcols = constant]
  data
}
fn_const<-function(id, year, constant){
  dat[ , (constant) := .SD[1L], by = c(id, year), .SDcols = constant]
}