Сравнение времени posix в r не ведет себя одинаково в цикле for и применяет функцию - PullRequest
0 голосов
/ 28 ноября 2018

Здравствуйте, у меня есть интересная проблема с R

Когда я делаю:

touchtimepairs = structure(list(v..length.v.. = structure(c(1543323677.254, 1543323678.137, 1543323679.181, 1543323679.918, 1543323680.729, 1543323681.803, 1543323682.523, 1543323682.977,1543323683.519, 1543323684.454), class = c("POSIXct", "POSIXt"), tzone = "CEST"),v.2.length.v.. = structure(c(1543323678.137, 1543323679.181, 1543323679.918, 1543323680.729, 1543323681.803, 1543323682.523, 1543323682.977, 1543323683.519, 1543323684.454, 1543323690.793), class = c("POSIXct", "POSIXt"), tzone = "CEST")), .Names = c("v..length.v..", "v.2.length.v.."), row.names = c(NA, 10L), class = "data.frame")

data = data.frame(a = seq(1,10), b = seq(21,30), posixtime = touchtimepairs[,1])



for(x in seq(nrow(touchtimepairs))){
    a = data$[data$posixtime < touchtimepairs[x,2],]
}

, это работает без проблем, я получаю результаты обратно, но когда я пытаюсь использовать apply

a = apply(touchtimepairs, 1, 
          function(x) data[data$posixtime < x[2],])

это больше не работает, я получаю пустой фрейм данных.То же самое происходит с командой subset ().Интересно, что когда я делаю> вместо <это работает! </p>

a = apply(touchtimepairs, 1, 
          function(x) data[data$posixtime > x[2],])

Тогда возникает другая проблема:

Применение в случае> сравнения дает другой результат, чем цикл for

1951 строк с apply и 1897 с циклом for

Кто-нибудь может воспроизвести это поведение?

Время posix также имеет миллисекунды, если это представляет интерес

Большое спасибо

1 Ответ

0 голосов
/ 28 ноября 2018

Если вы посмотрите на свои данные внутри анонимной функции apply, вы увидите симптом, который вызывает вашу проблему.

apply(touchtimepairs, 1, class)
#           1           2           3           4           5           6           7           8           9          10 
# "character" "character" "character" "character" "character" "character" "character" "character" "character" "character" 

(Должен возвращаться2-рядная матрица с POSIXct и POSIXt.) Следует также отметить, что я продолжал получать предупреждения о unknown timezone 'CEST'.Я временно исправил это с помощью attr(touchtimepairs[[1]], "tzone") <- "UTC", хотя это всего лишь помеха, чтобы остановить предупреждения на моей консоли.Это не решает проблему и может быть просто моей системой.: -)

Если вы пытаетесь использовать оба столбца touchtimepairs, у вас есть два варианта:

  1. Если вам действительно нужен только один из touchtimepairs ввремя, тогда lapply будет работать:

    lapply(touchtimepairs[[1]],
           function(x) subset(data, posixtime < x))
    
  2. Если вам нужно использовать оба столбца одновременно, используйте индекс для строк:

    lapply(seq_len(nrow(touchtimepairs)),
           function(i) subset(data, posixtime < touchtimepairs[i,2]))
    

    (где бы вы также ссылались на touchtimepairs[i,1]).

  3. Особенно, если вы пытаетесь использовать оба столбца одновременно, вы можете использовать Map:

    Map(function(a, b) subset(data, a < posixtime & posixtime <= b),
        touchtimepairs[[1]], touchtimepairs[[2]])
    

    (Это ничего не возвращает в ваших данных выборки, поэтому либо данные не являются наилучшей репрезентативной выборкой, либо вы не собираетесь использовать их таким образом. Скорее всего, последняя, ​​я просто догадываюсь:-)

    Самое большое различие между Map и семейством *apply заключается в том, что оно принимает один или более векторов / списков и объединяет их в архивы.В качестве примера этого эффекта «молния»:

    Map(func, 1:3, 11:13)
    

    эффективно вызывает:

    func(1, 11)
    func(2, 12)
    func(3, 13)
    
...