R data.table无法识别筛选器中的逻辑

R data.table无法识别筛选器中的逻辑,r,data.table,R,Data.table,在下面的代码段中,data.table在i中使用时似乎无法识别逻辑 我试图在一个极小的例子中重现这个问题的所有尝试都失败了,这就是为什么我在这里发布完整的部分。我希望它与“as.logical(cumsum(CURRENT_TRIP))”部分相关,但只是一种直觉 # Testdata timetable <- data.table(rbind( c("r1", "t1_1", "p1", 10, 10), c("r1", "t1_1", "p2", 11, 11),

在下面的代码段中,data.table在i中使用时似乎无法识别逻辑

我试图在一个极小的例子中重现这个问题的所有尝试都失败了,这就是为什么我在这里发布完整的部分。我希望它与“as.logical(cumsum(CURRENT_TRIP))”部分相关,但只是一种直觉

# Testdata
timetable <- data.table(rbind(
    c("r1", "t1_1", "p1", 10, 10),
    c("r1", "t1_1", "p2", 11, 11),
    c("r1", "t1_1", "p3", 12, 12),
    c("r1", "t1_1", "p4", 13, 13),
    c("r1", "t1_1", "p5", 14, 14),
    c("r1", "t1_1", "p6", 15, 15),
    c("r1", "t1_1", "p7", 16, 16),
    c("r1", "t1_1", "p8", 17, 17),
    c("r1", "t1_1", "p9", 18, 18),
    c("r1", "t1_1", "p10", 19, 19),

    c("r2", "t2", "p11", 9, 9),
    c("r2", "t2", "p12", 10, 10),
    c("r2", "t2", "p3", 11, 11),
    c("r2", "t2", "p13", 12, 12),
    c("r2", "t2", "p14", 13, 13),
    c("r2", "t2", "p15", 14, 14),
    c("r2", "t2", "p16", 15, 15),
    c("r2", "t2", "p17", 16, 16),
    c("r2", "t2", "p18", 17, 17)
  ))
setnames(timetable, c("ROUTE", "TRIP", "STOP", "ARRIVAL", "DEPARTURE"))
timetable[, ':='(ARRIVAL = as.integer(ARRIVAL), DEPARTURE = as.integer(DEPARTURE))]


# Input
startStation <- "p3"
startTime <- 8

setorder(timetable, TRIP, ARRIVAL)
timetable[, ID := .I]

timetable[,':='(ARR_ROUND_PREV = Inf, ARR_ROUND = Inf, ARR_BEST = Inf, MARKED = F, CURRENT_TRIP = F)]
timetable[STOP == startStation, ':='(ARR_ROUND_PREV = startTime, ARR_ROUND = startTime, ARR_BEST = startTime, MARKED = T)]

routes <- timetable[MARKED == T, unique(ROUTE)] 
ids <- timetable[MARKED == T & DEPARTURE > ARR_ROUND, .(ID = ID[DEPARTURE == min(DEPARTURE)]), by = ROUTE][, ID]

timetable[ID %in% ids, CURRENT_TRIP := T]
timetable[, MARKED := F]

trips <- timetable[CURRENT_TRIP == T, unique(TRIP)]
timetable[TRIP %in% trips, CURRENT_TRIP := as.logical(cumsum(CURRENT_TRIP)), by = TRIP]

# ?
timetable
nrow(timetable[CURRENT_TRIP == T]) #8
sum(timetable$CURRENT_TRIP == T) #15

# but 
nrow(timetable[CURRENT_TRIP > 0]) #15
nrow(timetable[CURRENT_TRIP == 1L]) #15
#测试数据

时间表你和我有完全相同的错误

我也不能用最少的代码复制它

我对代码的解决方案是更改列CURRENT_TRIP的设置方式

timetable[ID %in% ids]$CURRENT_TRIP <- T
timetable[, MARKED := F]

trips <- timetable[CURRENT_TRIP == T, unique(TRIP)]
timetable[TRIP %in% trips]$CURRENT_TRIP <- timetable[,as.logical(cumsum(CURRENT_TRIP)), by = TRIP]$V1

# ?
timetable
nrow(timetable[CURRENT_TRIP == T]) #8
sum(timetable$CURRENT_TRIP == T) #15

# but 
nrow(timetable[CURRENT_TRIP > 0]) #15
nrow(timetable[CURRENT_TRIP == 1L]) #15

timeline[ID%in%ids]$当前的旅程对我来说似乎是个bug。您可以设置
选项(datatable.auto.index=FALSE)
或使用
nrow(时刻表[(当前行程==T)])
。顺便说一句,您创建初始data.table的方法很愚蠢。不要为此使用
rbind
/
cbind
。除了构建data.table之外,您还使用了
':='
而不是
:=/code>周围的“``”。此外:我不能重现这个问题。你能指出你在哪里有问题吗<代码>按逻辑(cumsum(当前行程))
按预期工作(使用OSX上的data.table 1.9.7和R 3.2.2)。@Jaap问题是nrow(时刻表[CURRENT\u TRIP==T])
的结果,它应该是15,而不是8。(但我承认,这个例子是可复制的,但远远不是最小的。)@Roland这确实很奇怪,添加这一点已经在最新的数据上进行了测试。我们所说的table稳定版本(1.9.6)和Mac OSX上的R3.2.2。有缺陷的代码和修复程序都按照预期运行。嗨,包开发人员报告并接受了该缺陷。请参见此处了解更新:谢谢!这太好了!