2013-01-17 53 views
2

我有一個包含月度回報和相應月份的數據框。根據列名和行名合併數據框,創建條件列

Data <- read.csv("C:/Users/h/Desktop/overflow.csv", sep=";", dec=",") 
Data$Date <- as.Date(as.character(Data$Date), format="%Y-%m-%d") 

的數據幀現在看起來是這樣的:

> Data 
      Fund.A Fund.B Fund.C Fund.D 
2012-01-01 -0.01 0.04 0.11 0.10 
2012-02-01 -0.04 -0.06 0.08 0.11 
2012-03-01 -0.04 -0.07 0.15 -0.03 
2012-04-01 0.00 -0.08 -0.04 0.13 
2012-05-01 -0.07 0.10 0.06 0.02 
2012-06-01 -0.05 0.06 0.06 -0.02 
2012-07-01 0.12 -0.06 -0.09 -0.06 
2012-08-01 0.08 -0.03 0.05 0.13 
2012-09-01 0.10 0.07 -0.02 0.15 
2012-10-01 -0.08 0.14 0.00 -0.04 
2012-11-01 -0.09 0.11 -0.07 0.12 
2012-12-01 -0.01 -0.09 0.07 -0.02 

現在我想繼續與新的收益時間序列,從一個新的CSV,通過簡單地匹配,在合適的基金新的回報「數據」。我的問題是新資產可能已被添加,搞亂了訂單。

import <- read.csv("C:/Users/h/Desktop/import.csv", sep=";", dec=",") 
import 
      2013-01-01 
1 Funds:   NA 
2 Fund A  0.04 
3 Fund AA  -0.09 
4 Fund C  -0.10 
5 Fund D  0.03 
6 Fund B  0.14 

正如你所看到的,「進口」的csv在「數據」看到新資產(基金AA)以及資產(基金到d),其中資金是行而不是列。我如何編寫一個代碼,它匹配並添加一行到「數據」,其中「導入」中的值位於「數據」中的右列(基金)下方?如果新資產已添加,爲新資產創建一列?

作爲獎勵,如果「導入」中的日期比「數據」中最近的日期更新,代碼將只添加一行。只導入新的退貨。

欣賞它!

回答

1

對於時間序列的目的,我會建議使用xts。它讓生活變得更輕鬆。從Arun的可用數據借用:

olddata <- structure(list(Date = structure(c(15340, 15371, 15400, 15431, 
    15461, 15492, 15522, 15553, 15584, 15614, 15645, 15675), class = "Date"), 
    Fund.A = c(-0.01, -0.04, -0.04, 0, -0.07, -0.05, 0.12, 0.08, 0.1, -0.08, 
    -0.09, -0.01), Fund.B = c(0.04, -0.06, -0.07, -0.08, 0.1, 0.06, -0.06, 
    -0.03, 0.07, 0.14, 0.11, -0.09), Fund.C = c(0.11, 0.08, 0.15, -0.04, 
    0.06, 0.06, -0.09, 0.05, -0.02, 0, -0.07, 0.07), Fund.D = c(0.1, 0.11, 
    -0.03, 0.13, 0.02, -0.02, -0.06, 0.13, 0.15, -0.04, 0.12, -0.02)), 
    .Names = c("Date", "Fund.A", "Fund.B", "Fund.C", "Fund.D"), 
    row.names = c(NA, 12L), class = "data.frame") 

newimport <- structure(list(funds = c("Fund.A", "Fund.AA", "Fund.C", 
    "Fund.D", "Fund.B"), `2013-01-01` = c(0.04, -0.09, -0.1, 0.03, 0.14)), 
    .Names = c("funds", "2013-01-01"), row.names = c(NA, -5L), 
    class = "data.frame") 

數據轉換爲XTS方便datewise子集:

olddata <- xts(olddata[,-1], olddata$Date) 
newdata <- xts(t(newimport[,-1]), as.Date(colnames(newimport)[-1])) 
colnames(newdata) <- newimport[,1] 

合併數據在一起,而採取任何新列的護理:

cols <- names(newdata) %in% names(olddata) 
combineData <- merge(rbind(olddata, newdata[,cols]), newdata[,!cols]) 
combineData 
      Fund.A Fund.B Fund.C Fund.D Fund.AA 
2012-01-01 -0.01 0.04 0.11 0.10  NA 
2012-02-01 -0.04 -0.06 0.08 0.11  NA 
2012-03-01 -0.04 -0.07 0.15 -0.03  NA 
2012-04-01 0.00 -0.08 -0.04 0.13  NA 
2012-05-01 -0.07 0.10 0.06 0.02  NA 
2012-06-01 -0.05 0.06 0.06 -0.02  NA 
2012-07-01 0.12 -0.06 -0.09 -0.06  NA 
2012-08-01 0.08 -0.03 0.05 0.13  NA 
2012-09-01 0.10 0.07 -0.02 0.15  NA 
2012-10-01 -0.08 0.14 0.00 -0.04  NA 
2012-11-01 -0.09 0.11 -0.07 0.12  NA 
2012-12-01 -0.01 -0.09 0.07 -0.02  NA 
2013-01-01 0.04 0.14 -0.10 0.03 -0.09 
相關問題