R: data.table 列日期列上的动态聚合
R: data.table .dynamic aggregations on column Date columns
我正在尝试对 data.table
中的 动态选择的 列进行 min
/max
聚合。它非常适合 numeric
列,但我无法让它在 Date
列上工作,除非我创建一个临时的 data.table
.
当我使用名称时有效:
dt <- data.table(Index=1:31, Date = seq(as.Date('2015-01-01'), as.Date('2015-01-31'), by='days'))
dt[, .(minValue = min(Date), maxValue = max(Date))]
# minValue maxValue
# 1: 2015-01-01 2015-01-31
当我使用with=FALSE
时它不起作用:
colName = 'Date'
dt[, .(minValue = min(colName), maxValue = max(colName)), with=F]
# Error in `[.data.table`(dt, , .(minValue = min(colName), maxValue = max(colName)), :
# could not find function "."
我可以在数字列上使用 .SDcols
:
colName = 'Index'
dt[, .(minValue = min(.SD), maxValue = max(.SD)), .SDcols=colName]
# minValue maxValue
# 1: 1 31
但是当我对 Date 列执行相同操作时出现错误:
colName = 'Date'
dt[, .(minValue = min(.SD), maxValue = max(.SD)), .SDcols=colName]
# Error in FUN(X[[i]], ...) :
# only defined on a data frame with all numeric variables
如果我使用 lapply(.SD, min)
或 sapply()
,那么日期将更改为数字。
下面的工作似乎不浪费内存而且速度很快。还有更好的吗?
a <- dt[, colName, with=F]
setnames(a, 'a')
a[, .(minValue = min(a), maxValue = max(a))]
第一次尝试时:
dt[, .(minValue = min(colName), maxValue = max(colName)), with=F]
# Error in `[.data.table`(dt, , .(minValue = min(colName), maxValue = max(colName)), :
# could not find function "."
您只需阅读 Introduction to data.table 小插图即可理解 with=
的含义。如果您知道基础 R 中的 with()
函数,那就更容易了。
第二个:
dt[, .(minValue = min(.SD), maxValue = max(.SD)), .SDcols=colName]
# Error in FUN(X[[i]], ...) :
# only defined on a data frame with all numeric variables
这似乎是 min()
和 max()
在数据上的问题。frame/data。table 具有属性的列。这是一个 MRE。
df = data.frame(x=as.Date("2015-01-01"))
min(df)
# Error in FUN(X[[i]], ...) :
# only defined on a data frame with all numeric variables
要回答您的问题,您可以使用 get()
:
dt[, .(min = min(get(colName)), max = max(get(colName)))]
或者按照@Frank 的建议,[[
运算符对列进行子集化:
dt[, .(min = min(.SD[[colName]]), max = max(.SD[[colName]]))]
目前还没有更好的方法将 .SD
应用于多个函数(因为基础 R 似乎没有一个 AFAICT,并且 data.table 尝试尽可能多地使用基础 R 函数).有一个 FR #1063 来解决这个问题。 If/when 得到实施,然后可以做,例如:
# NOTE: not yet implemented, FR #1063
dt[, colwise(.SD, min, max), .SDcols = colName]
我正在尝试对 data.table
中的 动态选择的 列进行 min
/max
聚合。它非常适合 numeric
列,但我无法让它在 Date
列上工作,除非我创建一个临时的 data.table
.
当我使用名称时有效:
dt <- data.table(Index=1:31, Date = seq(as.Date('2015-01-01'), as.Date('2015-01-31'), by='days'))
dt[, .(minValue = min(Date), maxValue = max(Date))]
# minValue maxValue
# 1: 2015-01-01 2015-01-31
当我使用with=FALSE
时它不起作用:
colName = 'Date'
dt[, .(minValue = min(colName), maxValue = max(colName)), with=F]
# Error in `[.data.table`(dt, , .(minValue = min(colName), maxValue = max(colName)), :
# could not find function "."
我可以在数字列上使用 .SDcols
:
colName = 'Index'
dt[, .(minValue = min(.SD), maxValue = max(.SD)), .SDcols=colName]
# minValue maxValue
# 1: 1 31
但是当我对 Date 列执行相同操作时出现错误:
colName = 'Date'
dt[, .(minValue = min(.SD), maxValue = max(.SD)), .SDcols=colName]
# Error in FUN(X[[i]], ...) :
# only defined on a data frame with all numeric variables
如果我使用 lapply(.SD, min)
或 sapply()
,那么日期将更改为数字。
下面的工作似乎不浪费内存而且速度很快。还有更好的吗?
a <- dt[, colName, with=F]
setnames(a, 'a')
a[, .(minValue = min(a), maxValue = max(a))]
第一次尝试时:
dt[, .(minValue = min(colName), maxValue = max(colName)), with=F]
# Error in `[.data.table`(dt, , .(minValue = min(colName), maxValue = max(colName)), :
# could not find function "."
您只需阅读 Introduction to data.table 小插图即可理解 with=
的含义。如果您知道基础 R 中的 with()
函数,那就更容易了。
第二个:
dt[, .(minValue = min(.SD), maxValue = max(.SD)), .SDcols=colName]
# Error in FUN(X[[i]], ...) :
# only defined on a data frame with all numeric variables
这似乎是 min()
和 max()
在数据上的问题。frame/data。table 具有属性的列。这是一个 MRE。
df = data.frame(x=as.Date("2015-01-01"))
min(df)
# Error in FUN(X[[i]], ...) :
# only defined on a data frame with all numeric variables
要回答您的问题,您可以使用 get()
:
dt[, .(min = min(get(colName)), max = max(get(colName)))]
或者按照@Frank 的建议,[[
运算符对列进行子集化:
dt[, .(min = min(.SD[[colName]]), max = max(.SD[[colName]]))]
目前还没有更好的方法将 .SD
应用于多个函数(因为基础 R 似乎没有一个 AFAICT,并且 data.table 尝试尽可能多地使用基础 R 函数).有一个 FR #1063 来解决这个问题。 If/when 得到实施,然后可以做,例如:
# NOTE: not yet implemented, FR #1063
dt[, colwise(.SD, min, max), .SDcols = colName]