【发布时间】:2020-12-03 19:36:51
【问题描述】:
我想为一个包含 50 多列的数据表创建一个数据字典。首先,我想创建汇总对象、数据表或类似对象,在源数据表中每列有一行,列显示最早和最新的非缺失值、最小值和最大值、缺失值的数量等.我试图通过循环我的源数据表的列来做到这一点,但我无法让计算工作。这是我的代码的简化版本,加上一大块代码,可以满足我的要求,但没有循环:
require("data.table")
dtTest <- data.table(dObsDt = c("2020-08-01","2020-08-02","2020-08-03")
, nPrcp.LAKE = c(NA,12,13)
, nPrcp.PLAT = c(NA,NA,33)
)
dtTest
# Using loop
# Runs without error but does not produce desired results
vsCols <- colnames(dtTest)
dtColDesc <- data.table()
for (lasCol in vsCols) {
ldtVar <- data.table()
ladEarliest <- dtTest[!is.na(eval(lasCol)),list(dLatest=min(dObsDt))][[1]]
lanMax <- dtTest[!is.na(eval(lasCol)),list(dMax=max(eval(lasCol)))][[1]]
ldtVar[,':=' (sColName = lasCol
, nMax = lanMax
, dEarliest = ladEarliest
)]
dtColDesc <- rbind(dtColDesc, ldtVar, fill=TRUE)
}
dtColDesc
# Remove loop
# Runs without error and produces desired results but not scalable
vsCols <- colnames(dtTest)
dtColDesc <- data.table()
ldtVar <- data.table()
ladEarliest <- dtTest[!is.na(dObsDt),list(dLatest=min(dObsDt))][[1]]
lanMax <- dtTest[!is.na(dObsDt),list(dMax=max(dObsDt))][[1]]
ldtVar[,':=' (sColName = lasCol
, nMax = lanMax
, dEarliest = ladEarliest
)]
dtColDesc <- rbind(dtColDesc, ldtVar, fill=TRUE)
ldtVar <- data.table()
ladEarliest <- dtTest[!is.na(nPrcp.LAKE),list(dLatest=min(dObsDt))][[1]]
lanMax <- dtTest[!is.na(nPrcp.LAKE),list(dMax=max(nPrcp.LAKE))][[1]]
ldtVar[,':=' (sColName = lasCol
, nMax = lanMax
, dEarliest = ladEarliest
)]
dtColDesc <- rbind(dtColDesc, ldtVar, fill=TRUE)
ldtVar <- data.table()
ladEarliest <- dtTest[!is.na(nPrcp.PLAT),list(dLatest=min(dObsDt))][[1]]
lanMax <- dtTest[!is.na(nPrcp.PLAT),list(dMax=max(nPrcp.PLAT))][[1]]
ldtVar[,':=' (sColName = lasCol
, nMax = lanMax
, dEarliest = ladEarliest
)]
dtColDesc <- rbind(dtColDesc, ldtVar, fill=TRUE)
dtColDesc
【问题讨论】: