【问题标题】:How to filter data frame by range of row values with R?如何使用 R 按行值范围过滤数据帧?
【发布时间】:2021-01-07 06:04:19
【问题描述】:

我有以下数据框,我想过滤仅包含从 2019-06-01 到 2019-06-30 的值的数据框

    ds            yhat
1   2015-01-01    -100
2   2015-01-02     250
3   2015-01-03      50
4   …               60
5   2019-06-30     370

【问题讨论】:

  • 过滤 range 确实建议Date-class 对象(在这种情况下),但ds 列中的最后一个值是一个字符串。如果他们真的是Date 类,那么x[x$ds >= as.Date("2019-06-01") & x$ds <= as.Date("2019-06-30"),] 可能会起作用。 dplyr::betweendata.table::between(取决于您的偏好)都可用,将其从 dplyr::filter(x, between(ds, as.Date("2019-06-01"), as.Date("2019-06-30"))as.data.table(x)[ between(ds, as.Date("2019-06-01"), as.Date("2019-06-30"), ] 更改。
  • @r2evans 很好的观察,我纠正了这个例子。

标签: r dataframe filter row subset


【解决方案1】:

三种方法,取决于您选择的 R 生态系统:

### base R
subset(dat, as.Date("2019-06-01") <= ds & ds <= as.Date("2019-06-30"))
#           ds yhat
# 5 2019-06-30  370

### tidyverse
library(dplyr)
dplyr::filter(dat, between(ds, as.Date("2019-06-01"), as.Date("2019-06-30")))
#           ds yhat
# 5 2019-06-30  370

### data.table
library(data.table)
as.data.table(dat)[ between(ds, as.Date("2019-06-01"), as.Date("2019-06-30")), ]
#            ds yhat
# 1: 2019-06-30  370

(仅供参考:我在filter 前面加上dplyr:: 的唯一原因是有些人可能会在不加载dplyr 的情况下尝试调用,并且会发现stats::filter 的行为大不相同。一般来说,如果你library(dplyr)那么你应该可以做到filter(dat, ...)。)


数据:

ds 已转换为 Date-class。)

dat <- structure(list(ds = structure(c(16436, 16437, 16438, NA, 18077), class = "Date"), yhat = c(-100L, 250L, 50L, 60L, 370L)), row.names = c("1", "2", "3", "4", "5"), class = "data.frame")

【讨论】:

  • A.B.,如果这足以解决您的问题,那么请accept it;这样做不仅为回答者提供了一些积分,而且还为有类似问题的读者提供了一些关闭。 (也请考虑回到过去的问题。)当出现多个答案时,虽然您只能接受一个答案,但您可以选择对您认为有帮助的数量进行投票。 (如果仍有问题,您可能需要编辑您的问题并提供更多详细信息。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-29
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多