2015-12-23 9 views
5

の論理を認識しません.iで使用すると、data.tableは論理を認識していないようです。data.tableは、次のスニペットでフィルタ

最小限の例で問題を再現しようとする私の試みはすべて失敗しました。そのため、ここでは完全なセクションを投稿しています。私は、任意のアイデア

# 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 

...それは一部 "as.logical(CUMSUM(CURRENT_TRIP))" に関連すると予想されるが、ちょうど直感?

問題は勝利の64ビット上で、最新の1.9.7と1.9.6およびR 3.2.3を使用して現れ

のFab

+2

私にバグのようです。 'options(datatable.auto.index = FALSE)'を設定するか、 'nrow(時刻表[(CURRENT_TRIP == T)])'を使うことができます。 Btw、初期のdata.tableを作成するあなたの方法は愚かです。これには 'rbind' /' cbind'を使わないでください。 – Roland

+0

あなたのdata.tableの構築のほかに、あなたは ':='のまわりで '' 'の代わりに' ':=' 'を使用しています。さらに:私は問題を再現できません。 – Jaap

+0

あなたはどこに問題があると指摘できますか? 'as.logical(cumsum(CURRENT_TRIP))'は期待どおりに動作しています(OSX上のdata.table 1.9.7&R 3.2.2を使用)。 – Jaap

答えて

2

あなたは私が持っているとまったく同じバグを持っています!

Strange issue with data.table row search

私はまた、最小限のコードでそれを再現することができませんでした!

あなたのコードに対する私のソリューションは、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 

dT [、Column:= T]表記を使用して列を設定すると、同じ問題が発生しました。私はなぜこれを解決するためにdata.tablesの作成者と連絡を取っているのか分からない。

+0

これを追加するには最新のdata.table安定したリリース(1.9.6)とMac OSXのR 3.2.2。バグのコードと修正プログラムは、期待どおりに動作しました。 – nbafrank

+0

こんにちは、バグはパッケージ開発者によって報告され、受け入れられました。アップデートについてはこちらをご覧ください:https://github.com/Rdatatable/data.table/issues/1479 –

+0

ありがとうございます!これはいいね! – nbafrank

関連する問題