如何在data.table中的字符向量上使用apply函数

时间:2017-04-18 16:00:15

标签: r data.table

我试图了解我的数据的可用性,这可能看起来像:

ptr[2]

但当然要大得多。理想情况下,我希望看到这样的表:

DT <- data.table(id=rep(c("a","b"),each=20),time=rep(1991:2010,2),
             x=rbeta(40,shape1=1,shape2=2),
             y=rnorm(40))
#I have some NA's (no gaps):
DT[id=="a"&time<2000,x:=NA]
DT[id=="b"&time>2005,y:=NA]

所以非缺失最大时间段的非缺失最小值。我可以为一个变量得到它:

       a         b
x 2000-2010  1991-2010
y 1991-2010  1991-2005

但实际上,我想为许多变量做到这一点。然而,我所做的所有尝试都失败了,因为我很难将列向量传递给数据表。我的猜测是它向thisthis方向发展,但我尝试将这些解决方案调整为列向量失败。

例如,apply函数似乎不会评估字符向量的元素:

DT[,availability_x:=paste0(
        as.character(min(ifelse(!is.na(x),time,NA),na.rm=T)),
        "-",
        as.character(max(ifelse(!is.na(x),time,NA),na.rm=T))),
    by=id]

1 个答案:

答案 0 :(得分:3)

我们可以循环(lapply)通过'id'分组后.SDcols中指定的感兴趣的列,创建非NA元素的逻辑索引(!is.na),找到数字索引(which),获取range(即minmax),使用它来对“时间”列和paste时间进行子集化元素在一起。

DT[, lapply(.SD, function(x) paste(time[range(which(!is.na(x)))], 
                      collapse="-")), by = id, .SDcols = x:y]
#   id         x         y
#1:  a 2000-2010 1991-2010
#2:  b 1991-2010 1991-2005