【发布时间】:2017-04-18 16:00:14
【问题描述】:
我正在尝试了解我的数据的可用性,可能如下所示:
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
所以非缺失最小值到非缺失最大值时间段。我可以得到一个变量:
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]
但实际上,我想对许多变量都这样做。然而,我所有的尝试都失败了,因为我很难将列向量与数据表通信。我的猜测是它朝着this 或this 的方向发展,但我尝试将这些解决方案适应列向量的尝试失败了。
例如,apply 函数似乎不会评估字符向量的元素:
cols <- c("x","y")
availabilityfunction <- function(i){
DT[,paste0("avail_",i):=paste0(
as.character(min(ifelse(!is.na(i),time,NA),na.rm=T)),
"-",
as.character(max(ifelse(!is.na(i),time,NA),na.rm=T))),
by=id]}
lapply(cols,availabilityfunction)
【问题讨论】:
-
另一种选择:
melt(DT, id = c("id", "time"))[!is.na(value), as.list(summary(time)), by=.(id, variable)]或range代替summary。 -
这也很好,有助于我的理解。谢谢!
标签: r data.table