我目前正在处理数据框列表 实际上,我有大约一百个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
答案 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)