列表列出来合并矩阵
对不起,问一个什么可能似乎你们一个非常基本的问题上的东西,我想在R.列表列出来合并矩阵
我的数据做的是一个列表的列表。
dataset
$Series1
date Value
2015-11-01 1.301
2015-11-02 6.016
2015-11-03 4.871
2015-11-04 10.925
2015-11-05 7.638
$Series2
date Value
2015-11-01 1.532
2015-11-02 3.730
2015-11-03 6.910
2015-11-04 3.554
2015-11-05 2.631
有关如何转换为以下内容的任何想法?
datamatrix
date Series1 Series2
2015-11-01 1.301 1.532
2015-11-02 6.016 3.730
2015-11-03 4.871 6.910
2015-11-04 10.925 3.554
2015-11-05 7.638 2.631
您可以使用Reduce
合并时间序列
dataset = list(Series1=read.table(text="
date Value
2015-11-01 1.301
2015-11-02 6.016
2015-11-03 4.871
2015-11-04 10.925
2015-11-05 7.638",header=TRUE,stringsAsFactors=FALSE),Series2=read.table(text="
date Value
2015-11-01 1.532
2015-11-02 3.730
2015-11-03 6.910
2015-11-04 3.554
2015-11-05 2.631",header=TRUE,stringsAsFactors=FALSE))
mergeFun = function(x,y) merge(x,y,by="date")
datamatrix = Reduce(mergeFun,dataset)
colnames(datamatrix) = c("date",names(dataset))
datamatrix
# date Series1 Series2
# 2015-11-01 1.301 1.532
# 2015-11-02 6.016 3.730
# 2015-11-03 4.871 6.910
# 2015-11-04 10.925 3.554
# 2015-11-05 7.638 2.631
使用xts
库多个系列
我已经在数据集中添加额外列,并使用xts
你可以做到以下几点
require(xts)
dataset = list(Series1=read.table(text="
date Value
2015-11-01 1.301
2015-11-02 6.016
2015-11-03 4.871
2015-11-04 10.925
2015-11-05 7.638",header=TRUE,stringsAsFactors=FALSE),Series2=read.table(text="
date Value
2015-11-01 1.532
2015-11-02 3.730
2015-11-03 6.910
2015-11-04 3.554
2015-11-05 2.631",header=TRUE,stringsAsFactors=FALSE),Series3=read.table(text="
date Value
2015-11-01 1
2015-11-02 3
2015-11-03 6
2015-11-04 3
2015-11-05 2",header=TRUE,stringsAsFactors=FALSE),Series4=read.table(text="
date Value
2015-11-01 1.1
2015-11-02 3.2
2015-11-03 6.3
2015-11-04 3.4
2015-11-05 2.5",header=TRUE,stringsAsFactors=FALSE))
datasetXTS = lapply(dataset,function(x) {
z=xts(x[,-1],order.by=as.Date(x[,1],format="%Y-%m-%d"));
colnames(z) = tail(colnames(x),1);
z
})
datamatrix = Reduce(merge,datasetXTS)
datamatrix
# Value Value.1 Value.2 Value.3
#2015-11-01 1.301 1.532 1 1.1
#2015-11-02 6.016 3.730 3 3.2
#2015-11-03 4.871 6.910 6 6.3
#2015-11-04 10.925 3.554 3 3.4
#2015-11-05 7.638 2.631 2 2.
该系列已正确合并,但由于您在所有系列中都有相同的列名,所以它们会重复。要解决此问题,请执行以下操作:
colnames(datamatrix) = names(dataset)
datamatrix
# Series1 Series2 Series3 Series4
#2015-11-01 1.301 1.532 1 1.1
#2015-11-02 6.016 3.730 3 3.2
#2015-11-03 4.871 6.910 6 6.3
#2015-11-04 10.925 3.554 3 3.4
#2015-11-05 7.638 2.631 2 2.5
感谢您的回复。如果我在列表中有3个以上的系列,这种方法是行不通的? – MoreOnR
它适用于列表中的任何数字系列,只要它们具有相同的公共列 – OdeToMyFiddle
警告消息: 在merge.data.frame(x,y,by =“date”)中: 列名'Value.x','Value .y'在结果中是重复的 这是我得到的错误,如果有3个以上的系列。 – MoreOnR
您确定它是列表的列表吗? – Divi
是的,但它应该重要吗? – MoreOnR