【问题标题】:r select values below and after a certain value in a dataframer 在数据框中选择某个值以下和之后的值
【发布时间】:2012-06-12 16:54:37
【问题描述】:

我有一个问题,如何从表中选择某些值。我有一个包含时间和值的表格,我想在一定时间后获取下面的行。

Example-Data.Frame.

Time   Value
02:51  0.08033405 
05:30  0.43456738 
09:45  0.36052075 
14:02  0.45013807 
18:55  0.05745870
....# and so on

时间被编码为字符,但可以格式化。 现在我有例如时间“6:15”,并且想从表中获取该时间之前和之后的时间值(0.43456738 和 0.36052075)。 数据库实际上非常庞大,我有很多时间值。 任何人都有一个很好的建议如何做到这一点?

谢谢 鹬

【问题讨论】:

  • 如果正如您在问题中提到的那样,您从数据库中获取此 data.frame,那么获取这些数字的最有效方法是在数据库级别使用精心构建的查询。
  • @Justin 你的意思是使用 NoSQL 数据库吗?
  • sql 或 nosql 编写一个函数或存储过程来获取时间列表并返回最接近这些时间的值可能是最有效的,而不是将整个时间列表读入 R 并进行处理。 Huge 是相对的,但如果 op 真的意味着巨大,那么 R 保存在内存中的数据可能会非常大。
  • 正如贾斯汀所说,巨大确实是相对的,我更愿意在 r 中做到这一点。这不是日常程序,我只需要计算一次。因此,时间不应该是个大问题。
  • 大量数据(正如@Justin 指出的那样)是非常主观的。因此,如果您能对我们的规模有所了解,将会很有帮助。

标签: r time dataframe data.table xts


【解决方案1】:
value_before <- example_df[which(example_df$time=="09:45")-1, ]$value
value_after <- example_df[which(example_df$time=="09:45")+1, ]$value

# This could become a function

return_values <- function(df,cutoff) {
value_before <- df[which(df$time==cutoff)-1, ]$value
value_after <- df[which(df$time==cutoff)+1, ]$value
return(list(value_before, value_after))
}

return_values(exmaple_df, "09:15")

# 大型数据集的解决方案。

library(data.table)
df <- data.frame(time = 1:1000000, value = rnorm(1000000))
# create a couple of offsets
df$nvalue <- c(df$value[2:dim(df)[1]],NA)
df$pvalue <- c(NA,df$value[2:dim(df)[1]])
new_df <- data.table(df)
setkey(new_df,"time")

new_df[time==10]
 time      value     pvalue     nvalue
[1,]   10 -0.8488881 -0.1281219 -0.5741059


> new_df[time==1234]
     time      value   pvalue     nvalue
[1,] 1234 -0.3045015 0.708884 -0.5049194

【讨论】:

  • -1 因为 OP 说他的数据很大。这个答案会很慢,并且重新发明了执行此操作的几个包的轮子。
  • 对其进行了测试,但它不是这样工作的。 "which(df$time==cutoff)" 假设确切的时间在数据库中,但事实并非如此。
  • @Curlew xtsdata.table 都有二进制搜索,这正是您想要的。您正在有序键中查找缺失值,并且您有大量数据 => xtsdata.table,afaik。搜索 LOCF(最后一次观察结转)。在data.table 中,您需要roll=TRUEwhich=TRUE 来获得当前行,然后为之后的行+1。当心我写data.table时有偏见。
  • 我添加了一个适用于非常大数据集的解决方案。您不必进行完全匹配(我只是使用它,因为您的示例是 chr。在当前情况下,您可以测试任何条件。
  • @MatthewDowle 我爱data.table 并一直使用它。谢谢你写它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
相关资源
最近更新 更多