我有一个大数据集
dim(dt)
[1] 422096 162
其中dt
是一个密钥为tic
的data.table。我正在尝试为每组记录我有多少缺失的条目。这些组是时间序列,dt包含一个date
列,它是一个R日期,一个book_lev
列,我感兴趣的变量。
到目前为止,这是我的代码:
dt <- dt[sumdt]
sumdt <- dt[ ,list(min.date=min(date), max.date=max(date)), by="tic"]
sublengths <- dt[,list(tslen=length(date)),by=tic, mult="last"]
bt2 <- dt[sublengths, mult="first"]
bt2[, max.year:=extractyear(max.date)]
bt2[, min.year:=extractyear(min.date)]
bt2[, data.fullness:=tslen/(max.year - min.year + 1)]
dt <- dt[bt2]
我的想法是我创建了这个data.fullness值,如果时间序列中没有空洞,则该值应该等于1。我意识到我的book_lev
栏中可能有一些NA,所以我想进一步限制。另外,一般来说,我是data.tables的新手,我想看看是否有更好的方法来编写我刚才写的内容。
您可以使用R的load
命令加载一小部分数据,可在此处找到:http://econsteve.com/r/dt_sample.Robj
答案 0 :(得分:1)
如果您有一个矩形数据框并希望限制完成观察,您可以创建一个布尔值向量,用complete.cases
函数指示完全观察到的数据行。这假设您已使用R NA
清除了数据和缺失值的一致格式。
此布尔矢量可用于直接对值进行子集化,或使用subset
函数。
我不清楚您的问题描述或示例代码如何格式化dt对象,但您可能需要使用某些循环组合来成功获取数据的二维切片,其中complete.cases
可以应用
答案 1 :(得分:1)
(首先,请注意。我不确定我是否正确理解了您希望data.fullness
变量总结的内容。根据您链接到的数据集,我将其视为比例有一些数据的年份,从第一个测量年份到最后一个测量年份的间隔。)
以下是我做了解问题的方法:
## FIRST, DEFINE A COUPLE OF FUNCTIONS
extractYear <- function(X) {
as.numeric(format(as.Date(X, format="%m/%d/%Y"), "%Y"))
}
calcFullness <- function(YRS) {
length(unique(YRS))/(diff(range(YRS))+1)
}
## THEN SET TO WORK ON YOUR DATA.TABLE
key(dt) <- "tic"
dt[, year:=extractYear(datadate)]
# Extract summaries for each level of tic
ticSumm <-
dt[, list(min.year = min(year),
max.year = max(year),
data.fullness = calcFullness(year)), by=tic]
ticSumm
# tic min.year max.year data.fullness
# [1,] AMZN 1995 2010 1
# [2,] GM 1950 2010 1
# [3,] XOM 1950 2010 1
# Merge summary back into dt
dt <- dt[ticSumm]