【问题标题】:List of Dataframes filter row based on Date基于日期的数据框筛选行列表
【发布时间】:2016-02-14 16:18:20
【问题描述】:

我目前正在处理数据框列表。
实际上,我有大约一百个代表某种预测的 csv 文件,其中预测的日期在第一行,之后的行包含预测值。数据可能如下所示:

2010/04/15 10:12:51 #Date of the forecast
2010/05/02          2372  #Date for which the forecast was made and the value assigned
2010/05/09          2298

2009/04/15 10:09:13 #another forecast
....
2010/05/02          2298 #also predicts for 2010/05/02

正如您可能猜到的那样,预测确实预测了未来一段时间(例如 5 年)的值,这意味着对日期 2010/05/02 的预测不仅在 2010/04/15 进行,而且在 2009/04/ 15 以此类推(实际上,预测是每周进行一次)。
我想比较特定日期(例如 2010 年 5 月 2 日)的预测值随时间的变化情况。
现在,我将所有 .csv 数据作为数据框读取,并将每个生成的数据框保存在一个列表中。
(可悲的是,做出预测的日期丢失了——我希望能够用相应的日期命名列表元素,但还没有弄清楚如何做到这一点——不过,我很确定我会找到一些东西某处,不是这里的主要问题)

这就是问题标题的来源:我想知道如何按行值过滤数据框列表。
所以,我希望能够使用一个函数:function(2010/05/02) 并得到列表中每个元素的行(列表中的每个数据框),其中日期为 2010/05/02 .

在这种情况下,我想得到:

2010/05/02 2372
2010/05/02 2298

我知道如何使用 for 循环来做到这一点,但它需要无穷无尽的时间。 我很高兴有任何建议。
(通过这个例子,你可能会理解为什么知道预测是什么时候做出的很重要——我现在不知道。我正在考虑在每个数据帧中添加一个包含预测日期的新行)

到目前为止访问的主题包括: get column from list of dataframes R
convert a row of a data frame to a simple vector in R
How to get the name of a data.frame within a list?(或多或少解决了名称问题)
如您所见,没有线程特别有用。

根据要求,一个可重现的小例子:

dateList <- as.Date(seq(0,100,5),origin="2010-01-01")
forecasts <- seq(2000,3000,50)
df1 <- data.frame(dateList,forecasts)
df2 <- data.frame(dateList-50,forecasts)
l <- list(df1,df2)

我们将日期从 2010 年 1 月 1 日开始计算为 5 天。例如,我想知道两个数据帧中 2010-01-01 的预测值。
第一个数据框如下所示:

   dateList forecasts
1 2010-01-01      2000
2 2010-01-06      2050
3 2010-01-11      2100

第二个看起来像这样:

10    2009-12-27      2450
11    2010-01-01      2500
12    2010-01-06      2550

我希望找出例如 2010-01-01 的预测值。
所以,例如:
功能(2010-01-01):
2000 2500

【问题讨论】:

  • 您能否提供一个可重现的示例(一小部分 data.frames)?

标签: r list filter dataframe row


【解决方案1】:

等不及你的例子,所以我做了一个小例子。让我知道这是否符合您所追求的总体方向。

xy <- list(df1 = data.frame(dates = as.Date(c("2016-01-01", "2016-01-02", "2016-01-03")), value = runif(3)),
           df2 = data.frame(dates = as.Date(c("2016-01-01", "2016-01-02", "2016-01-03")), value = runif(3)),
           df3 = data.frame(dates = as.Date(c("2016-01-01", "2016-01-02", "2016-01-03")), value = runif(3))
           )

getValueOnDate <- function(x, list.all) {
  lapply(list.all, FUN = function(m) m[m$dates %in% x, ])
}

out <- getValueOnDate(as.Date("2016-01-02"), list.all = xy)

do.call("rbind", out)

         dates     value
df1 2016-01-02 0.7665590
df2 2016-01-02 0.9907976
df3 2016-01-02 0.4909025

您显然可以修改函数以仅返回值。

【讨论】:

  • 其实,这正是我想做的。经过一些小的修改后完美工作!谢谢你。你有什么建议让我更好地学习 R 吗?除了尝试和失败还有什么?如果知道 Basic Java,有什么好书?
  • @user18093 练习。
  • @user18093 也许this 会让你走上正确的道路
【解决方案2】:

您也可以使用以下方法,假设您的列表名为 ls 并且日期列 date 在所有 data.frame 中:

my.ls <- lapply(ls, subset, date == "2010/05/02")
df <- do.call("rbind", my.ls)

【讨论】:

    猜你喜欢
    • 2022-11-23
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    相关资源
    最近更新 更多