R 将数据帧列表转换为时间序列
我有以下由股票价格组成的数据框列表。每个数据帧可能具有不同的长度,并且并非所有日期都在每个数据帧中。我想将列表转换为一个时间序列,第一列是日期,每列是股票价格,列名是股票名称。如果给定日期的价格缺失,则采用上一个价格R 将数据帧列表转换为时间序列,r,dataframe,R,Dataframe,我有以下由股票价格组成的数据框列表。每个数据帧可能具有不同的长度,并且并非所有日期都在每个数据帧中。我想将列表转换为一个时间序列,第一列是日期,每列是股票价格,列名是股票名称。如果给定日期的价格缺失,则采用上一个价格 $`0P00012DY5`<br/> last<br/> 2017-08-21 9.49504<br/> 2017-08-22 9.53553<br/> 2017-08-23 9.52643<br/&
$`0P00012DY5`<br/>
last<br/>
2017-08-21 9.49504<br/>
2017-08-22 9.53553<br/>
2017-08-23 9.52643<br/>
2017-08-24 9.53486<br/>
2017-08-25 9.53390<br/>
2017-08-28 9.48788<br/>
2017-08-29 9.44059<br/>
2017-08-30 9.49893<br/>
$`0P0000KY8J`<br/>
last<br/>
2017-08-21 11.58276<br/>
2017-08-22 11.58278<br/>
2017-08-23 11.58275<br/>
2017-08-24 11.58263<br/>
2017-08-25 11.58260<br/>
2017-08-29 11.58250<br/>
2017-08-30 11.58246<br/>
2017-08-31 11.58237<br/>
$`0P00012DY5`
最后一次
2017-08-21 9.49504
2017-08-22 9.53553
2017-08-23 9.52643
2017-08-24 9.53486
2017-08-25 9.53390
2017-08-28 9.48788
2017-08-29 9.44059
2017-08-30 9.49893
$`0P0000KY8J`
最后一次
2017-08-21 11.58276
2017-08-22 11.58278
2017-08-23 11.58275
2017-08-24 11.58263
2017-08-25 11.58260
2017-08-29 11.58250
2017-08-30 11.58246
2017-08-31 11.58237
期望输出
date 0P00012DY5 0P0000KY8J<br/>
2017-08-21 9.49504 11.58276<br/>
2017-08-22 9.53553 11.58278<br/>
2017-08-23 9.52643 11.58275<br/>
2017-08-24 9.53486 11.58263<br/>
2017-08-25 9.53390 11.58260<br/>
2017-08-28 9.48788 11.58260<br/>
2017-08-29 9.44059 11.58250<br/>
2017-08-30 9.49893 11.58246<br/>
2017-08-31 9.49893 11.58237<br/>
日期0P00012DY5 0P0000KY8J
2017-08-21 9.49504 11.58276
2017-08-22 9.53553 11.58278
2017-08-23 9.52643 11.58275
2017-08-24 9.53486 11.58263
2017-08-25 9.53390 11.58260
2017-08-28 9.48788 11.58260
2017-08-29 9.44059 11.58250
2017-08-30 9.49893 11.58246
2017-08-31 9.49893 11.58237
名单结构:
mod_ll <- structure(list(`0P00012DY5` = structure(list(last = c(9.49504,
9.53553, 9.52643, 9.53486, 9.5339, 9.48788, 9.44059, 9.49893,
9.542, 9.56865, 9.5417, 9.54301, 9.52942, 9.54246, 9.54653, 9.60182,
9.63157, 9.62566, 9.64084, 9.62746, 9.65814, 9.6672, 9.66387)), .Names = "last", row.names = c("2017-08-21",
"2017-08-22", "2017-08-23", "2017-08-24", "2017-08-25", "2017-08-28",
"2017-08-29", "2017-08-30", "2017-08-31", "2017-09-01", "2017-09-04",
"2017-09-05", "2017-09-06", "2017-09-07", "2017-09-08", "2017-09-11",
"2017-09-12", "2017-09-13", "2017-09-14", "2017-09-15", "2017-09-18",
"2017-09-19", "2017-09-20"), class = "data.frame"), `0P0000KY8J` = structure(list(
last = c(11.58276, 11.58278, 11.58275, 11.58263, 11.5826,
11.58254, 11.5825, 11.58246, 11.58237, 11.58231, 11.58223,
11.58219, 11.58218, 11.58206, 11.58202, 11.58197, 11.58193,
11.58189, 11.58178, 11.58174, 11.58173, 11.58166, 11.58163
)), .Names = "last", row.names = c("2017-08-21", "2017-08-22",
"2017-08-23", "2017-08-24", "2017-08-25", "2017-08-28", "2017-08-29",
"2017-08-30", "2017-08-31", "2017-09-01", "2017-09-04", "2017-09-05",
"2017-09-06", "2017-09-07", "2017-09-08", "2017-09-11", "2017-09-12",
"2017-09-13", "2017-09-14", "2017-09-15", "2017-09-18", "2017-09-19",
"2017-09-20"), class = "data.frame")), .Names = c("0P00012DY5",
"0P0000KY8J"))
mod_llAtidyverse
基于的解决方案可以是使用dplyr::bind_rows
组合列表中的所有数据帧。然后将Date
和Value
分为两列,并使用tidyr::spread
以wide
格式更改数据
最后,对于缺少的日期,使用tidyr::fill
填充最后可用的值
library(tidyverse)
bind_rows(ll, .id="Name") %>%
separate(last, c("Date", "Value"), sep=" ") %>%
mutate(Date = as.Date(Date)) %>%
spread(Name, Value) %>%
fill(2:3)
# Date 0P0000KY8J 0P00012DY5
# 1 2017-08-21 11.58276 9.49504
# 2 2017-08-22 11.58278 9.53553
# 3 2017-08-23 11.58275 9.52643
# 4 2017-08-24 11.58263 9.53486
# 5 2017-08-25 11.58260 9.53390
# 6 2017-08-28 11.58260 9.48788
# 7 2017-08-29 11.58250 9.44059
# 8 2017-08-30 11.58246 9.49893
# 9 2017-08-31 11.58237 9.49893
编辑:更新以包括OP提供的修改数据的答案。日期
作为数据的行名提供。帧
。在合并数据帧之前,我们需要将Date
移动到列中。可以使用列表中的lappy
将rownames\u移动到列中
library(tidyverse)
bind_rows(lapply(mod_ll,rownames_to_column, var="Date"), .id="Name") %>%
mutate(Date = as.Date(Date)) %>%
spread(Name, last) %>%
fill(2:3)
# Date 0P0000KY8J 0P00012DY5
# 1 2017-08-21 11.58276 9.49504
# 2 2017-08-22 11.58278 9.53553
# 3 2017-08-23 11.58275 9.52643
# 4 2017-08-24 11.58263 9.53486
# 5 2017-08-25 11.58260 9.53390
# 6 2017-08-28 11.58254 9.48788
#
#....so on
数据:
df1 <- read.table(text =
"last
'2017-08-21 9.49504'
'2017-08-22 9.53553'
'2017-08-23 9.52643'
'2017-08-24 9.53486'
'2017-08-25 9.53390'
'2017-08-28 9.48788'
'2017-08-29 9.44059'
'2017-08-30 9.49893'",
header = TRUE, stringsAsFactors = FALSE)
df2 <- read.table(text =
"last
'2017-08-21 11.58276'
'2017-08-22 11.58278'
'2017-08-23 11.58275'
'2017-08-24 11.58263'
'2017-08-25 11.58260'
'2017-08-29 11.58250'
'2017-08-30 11.58246'
'2017-08-31 11.58237'",
header = TRUE, stringsAsFactors = FALSE)
ll <- list(df1, df2)
names(ll) <- c('0P00012DY5', '0P0000KY8J')
df1@marcl好极了。请删除以上聊天中的评论,因为这些评论对未来的用户没有帮助。