R中的posix时间比较在for循环和Apply函数中表现不一样

您好,我遇到了一个有趣的问题

当我做 :

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()命令相同。有趣的是,当我做>而不是<它起作用时!

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

然后还有另一个问题:

在>比较的情况下应用,则为for循环提供另一个结果

1951行带apply和1897行带for循环

任何人都可以重现这种行为吗?

如果有兴趣的话,posix时间也可以是毫秒

非常感谢

r2evans

如果你看一下你的数据里面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" 

(它应该返回带有POSIXct的2行矩阵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)
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章