基于日期的Dataframes过滤行列表

时间:2016-02-14 16:18:21

标签: r list filter dataframe row

我目前正在处理数据框列表 实际上,我有大约一百个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/05/02)的预测值随时间的变化情况 现在,我读入了作为数据帧的所有.csv数据,并将每个结果数据帧保存在列表中。
(可悲的是,预测的日期已经丢失了 - 我希望能够用相应的日期命名列表元素,但还没有弄清楚如何做到这一点 - 我仍然很确定我会找到一些东西在某个地方,这里不是主要问题)

这就是问题标题的来源:我想知道如何按行值过滤数据帧列表。
所以,我希望能够使用函数:function(2010/05/02)并得到列表中每个元素的行(列表中的每个数据帧),其中Date是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-01-01,为期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

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:1)

您也可以使用以下方法,因为您的列表名为ls,所有date的日期列为data.frame

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