2015-12-23 23 views
5

filtresinde mantıksal olarak tanınmadığından, data.table, i'de kullanıldığında mantıksal değerleri tanıyacaktır.data.table, aşağıdaki kod parçasında

Sorunu en az bir örnekte yeniden oluşturma girişimlerim başarısız oldu, bu yüzden burada bölümün tamamını gönderiyorum. Ben

# 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 

herhangi bir fikir ... Bu kısmı "as.logical (cumsum (CURRENT_TRIP))", ama sadece bir hislerime ile ilişkili olduğu bekliyoruz?

Sorun Win 64bit yeni 1.9.7 ve 1.9.6 ve R 3.2.3 kullanarak gösterir

Fab

+2

Bana bir hata gibi görünüyor. 'Options (datatable.auto.index = FALSE)' ayarlayabilir ya da 'nrow (zaman çizelgesi [(CURRENT_TRIP == T)])' kullanabilirsiniz. Btw, ilk data.table yaratma yolunuz aptalca. Bunun için 'rbind' /' cbind' kullanmayın. – Roland

+0

Verilerinizin oluşturulmasının yanı sıra, ': =' yerine '': = ''yerine. Ayrıca: Sorunu yeniden oluşturamıyorum. – Jaap

+0

Bir sorunun nerede olduğunu işaret edebilir misiniz? 'as.logical (cumsum (CURRENT_TRIP))' beklendiği gibi çalışıyor (OSX üzerinde data.table 1.9.7 & R 3.2.2 kullanarak). – Jaap

cevap

2

Sen sahip tam olarak aynı hata var !!!

Strange issue with data.table row search

Ben de minimal bir kodla yeniden olamazdı!

Kodunuza olan çözümüm, CURRENT_TRIP sütununu nasıl ayarlayacağınızı değiştiriyor.

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 

Sütunların ayarlanması için dT [, Sütun: = T] notasyonu kullanılması aynı soruna neden oldu! Neden emin değilim ve bunu düzeltmek için data.tables'in yaratıcısıyla iletişim halinde olduğumdan emin değilim!

+0

Ayrıca bunu eklemek için en son data.table test edildi Mac OSX'te konuştuğumuz gibi kararlı sürüm (1.9.6) ve R 3.2.2. Hem kodlanmış kod hem de düzeltme beklendiği gibi davrandı. – nbafrank

+0

Merhaba, hata paket geliştiriciler tarafından bildirildi ve kabul edildi. Güncellemeler için buraya bakın: https://github.com/Rdatatable/data.table/issues/1479 –

+0

Teşekkür ederiz! Bu güzel! – nbafrank