【问题标题】:data.table :convert variables to constant within an iddata.table :将变量转换为 id 内的常量
【发布时间】:2015-12-07 05:10:40
【问题描述】:

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

}

【问题讨论】:

  • “任意大小的向量,取决于我要转换为常量的变量数量”请详细说明。
  • 对于您的主要任务,dat[, `:=`(var1=var1[1], var2=var2[1]), by=.(id,year)] 应该可以解决问题
  • 在我的情况下,我确实有一个更大的数据,其中包含更多我想转换为常量的变量。因此,例如,变量可以是 constant=c("var1", "var2", .... "var10") 而不仅仅是本例中的两个。这就是为什么我想知道如何使您提供的这个解决方案更通用。

标签: r data.table


【解决方案1】:

我想这就是你想要的:

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 &lt;- fn_const(...) 之类的东西,这可能并不理想(制作副本)。相反,为什么不将data 作为参数消除:

fn_const<-function(id, year, constant){
  dat[ , (constant) := .SD[1L], by = c(id, year), .SDcols = constant]
}

现在只需运行fn_const(id, year, constant) 将通过引用dat 分配constant,无需复制。

TBH 首先,我并没有真正看到将其作为函数编写的任何好处,除非您打算一遍又一遍地这样做,以节省空间。

【讨论】:

    猜你喜欢
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多