使用函数调用对R data.table进行子集设置:如何返回结果向量而不是仅返回一个结果?
我正在尝试根据我编写的函数对data.table进行子集 我发现R只调用我的函数一次(而不是每行一次)。然而,我调试这个时遇到了麻烦,因为我只能在data.table的上下文中处理日期 出于运行时的目的,我不能使用For循环单独检查每一行。 如果这个问题可以在没有自定义函数的情况下解决,我也会很高兴使用函数调用对R data.table进行子集设置:如何返回结果向量而不是仅返回一个结果?,r,data.table,R,Data.table,我正在尝试根据我编写的函数对data.table进行子集 我发现R只调用我的函数一次(而不是每行一次)。然而,我调试这个时遇到了麻烦,因为我只能在data.table的上下文中处理日期 出于运行时的目的,我不能使用For循环单独检查每一行。 如果这个问题可以在没有自定义函数的情况下解决,我也会很高兴 库(“data.table”) 图书馆(“动物园”) dt不确定我是否理解正确。以下是使用非等联接的方法: DT[, oneweekago := Date - 7] DT[, anySalesLas
库(“data.table”)
图书馆(“动物园”)
dt不确定我是否理解正确。以下是使用非等联接的方法:
DT[, oneweekago := Date - 7]
DT[, anySalesLastWeek :=
DT[DT, on=.(Date>=oneweekago, Date<Date), allow.cartesian=TRUE,
sum(Sales, na.rm=TRUE) > 0, by=.EACHI]$V1
]
数据:
库(“data.table”)
DT您想用函数检测什么?你介意用语言解释吗?当然可以。我想知道在某个特定日期,上周是否有销售。编辑:因此,我检查dt中是否有在参数日期前七到一天日期(该行中的列值)为非零销售额的行。请尝试dt[sapply(Date,anysaleslatweek),]
我不确定是否理解您的行选择标准。选择第1行是因为?谢谢你,@Rohit,这种方法很有效(我应该自己想出来)。然而,我仍然不明白为什么像dt[is.Date(日期),]
这样的东西可以工作,而dt[anysaleslatweek(日期),]
却不能。我不需要使用dt[sappy(Date,is.Date),]
。谢谢你,你的第一种方法正是我想要的。但是,我仍然不明白为什么像dt[is.Date(Date),]这样的东西可以工作,而dt[anysaleslatweek(Date),]却不能。您将行日期与所有日期进行比较,因此需要sapply
应用于向量中的每个元素(行日期)(Date
)
Date Sales oneweekago anySalesLastWeek
1: 2019-10-04 0 2019-09-27 FALSE
2: 2019-10-05 0 2019-09-28 FALSE
3: 2019-10-06 0 2019-09-29 FALSE
4: 2019-10-07 0 2019-09-30 FALSE
5: 2019-10-08 0 2019-10-01 FALSE
6: 2019-10-09 1 2019-10-02 FALSE
7: 2019-10-10 1 2019-10-03 TRUE
8: 2019-10-11 1 2019-10-04 TRUE
9: 2019-10-12 1 2019-10-05 TRUE
10: 2019-10-13 1 2019-10-06 TRUE
library("data.table")
DT <- data.table(Date=seq(Sys.Date(), by="1 day", length.out=10), Sales=c(rep(0, 5), rep(1, 5)))
# Date Sales
# 1: 2019-10-04 0
# 2: 2019-10-05 0
# 3: 2019-10-06 0
# 4: 2019-10-07 0
# 5: 2019-10-08 0
# 6: 2019-10-09 1
# 7: 2019-10-10 1
# 8: 2019-10-11 1
# 9: 2019-10-12 1
#10: 2019-10-13 1
anySalesLastWeek <- function(date) {
DT[as.integer(Date - as.Date(date)) %in% -7:-1 & Sales > 0, .N>0]
}
DT[sapply(Date, anySalesLastWeek)]