使用函数调用对R data.table进行子集设置:如何返回结果向量而不是仅返回一个结果?

使用函数调用对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进行子集

我发现R只调用我的函数一次(而不是每行一次)。然而,我调试这个时遇到了麻烦,因为我只能在data.table的上下文中处理日期

出于运行时的目的,我不能使用For循环单独检查每一行。 如果这个问题可以在没有自定义函数的情况下解决,我也会很高兴

库(“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)]