我试图了解我的数据的可用性,这可能看起来像:
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
但实际上,我想为许多变量做到这一点。然而,我所做的所有尝试都失败了,因为我很难将列向量传递给数据表。我的猜测是它向this或this方向发展,但我尝试将这些解决方案调整为列向量失败。
例如,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]
答案 0 :(得分:3)
我们可以循环(lapply
)通过'id'分组后.SDcols
中指定的感兴趣的列,创建非NA元素的逻辑索引(!is.na
),找到数字索引(which
),获取range
(即min
和max
),使用它来对“时间”列和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