将值(对于特定日期)从第二个数据帧替换为第一个数据帧

时间:2012-10-21 15:58:42

标签: r

我有两个时间序列数据框:

第一个:

head(df1) :

            MSCI ACWI    DJGlbl Russell 1000 Russell Dev S&P GSCI Industrial  S&P GSCI Precious
1999-03-01 -0.7000000 0.2000000   -0.1000000  -1.5000000           -1.0000000        -0.4000000
1999-03-02 -0.5035247 0.0998004   -0.7007007  -0.2030457            0.4040404        -0.3012048
1999-03-03 -0.2024291 0.2991027    0.0000000  -0.6103764            0.1006036        -0.1007049
1999-03-04  0.7099391 0.2982107    1.5120968  -0.1023541            0.5025126         0.4032258
1999-03-05  2.4169184 0.8919722    2.1847071   2.7663934           -1.2000000         0.0000000
1999-03-08  0.3933137 0.3929273    0.5830904  -0.0997009           -0.2024291         1.1044177


tail(df1) : 

             MSCI ACWI      DJGlbl Russell 1000 Russell Dev S&P GSCI Industrial  S&P GSCI Precious
2011-12-23  0.68241470  0.84790673    0.9441385   0.6116208            0.5822862        -0.2345300
2011-12-26 -0.05213764  0.00000000    0.0000000   0.0000000            0.0000000         0.0000000
2011-12-27  0.20865936  0.05254861    0.3117693   0.2431611            0.0000000        -0.7233273
2011-12-28 -0.62467465 -1.20798319   -1.1655012  -0.9702850           -2.0414381        -2.4043716
2011-12-29  0.52383447  0.47846890    0.8647799   0.5511329           -0.0933126        -1.2504666
2011-12-30  0.26055237  1.03174603   -0.4676539   1.2180268            1.9613948         1.7388017

第二个:

    head(df2) :
                 MSCI.ACWI     DJGlbl Russell.1000 Russell.Dev S.P.GSCI.Industrial S.P.GSCI.Precious
     1999-06-01  0.00000000 0.24438520    0.0000000           0         -0.88465521       0.008522842
     1999-07-01  0.12630441 0.06755621    0.0000000           0          0.29394697       0.000000000
     1999-08-02  0.07441812 0.18922829    0.0000000           0          0.02697299      -0.107155063
     1999-09-01 -0.36952701 0.08684107    0.1117509           0          0.24520976       0.000000000
     1999-10-01  0.00000000 0.00000000    0.0000000           0          0.00000000       1.941266205
     1999-11-01  0.41879925 0.00000000    0.0000000           0          0.00000000      -0.197897901


    tail(df2) :
                 MSCI.ACWI    DJGlbl  Russell.1000 Russell.Dev S.P.GSCI.Industrial S.P.GSCI.Precious
     2011-07-01  0.00000000 0.0000000    0.0000000   0.0000000          0.00000000        -0.1141162
     2011-08-01  0.00000000 0.0000000    0.0000000   0.0000000          0.02627347         0.0000000
     2011-09-01 -0.02470873 0.2977585   -0.0911891   0.6367605          0.00000000         0.2830977
     2011-10-03  0.42495188 0.0000000    0.4200743  -0.4420027         -0.41012646         0.0000000
     2011-11-01  0.00000000 0.0000000    0.0000000  -0.6597739          0.00000000         0.0000000
     2011-12-01  0.50273034 0.0000000    0.0000000   0.6476393          0.00000000         0.0000000

第一个df包含每日观察结果。第二个df包含“每月的第一天”预测值。 我想将第二个df中的值替换为第一个。换句话说,第一个df中的“每个月的第一天”值将代替来自第二个df的“每个月的第一天”值。 我试着编写一个替换值的lapply循环,并且只是尝试使用匹配函数。但我失败了。我在StackOverflow上找不到类似的问题......

非常感谢任何建议!

P.S。

事情是上面的df是时间序列。即我将df转换为时间序列:

library(fPortfolio)
charvec=dfnottimeseries[,1]
df1=as.timeSeries(dfnottimeseries,charvec)

和第二个df(df2)相同。例如:

dput(head(df1)) :
new("timeSeries"
    , .Data = structure(c(-0.700000000000003, -0.503524672708963, -0.202429149797574, 
0.709939148073025, 2.41691842900303, 0.393313667649942, 0.200000000000003, 
0.0998003992015911, 0.299102691924224, 0.298210735586492, 0.891972249752221, 
0.392927308447943, -0.0999999999999943, -0.700700700700703, 0, 
1.51209677419355, 2.18470705064548, 0.583090379008741, -1.5, 
-0.203045685279191, -0.610376398779241, -0.102354145342895, 2.76639344262295, 
-0.0997008973080701, -1, 0.40404040404041, 0.100603621730377, 
0.50251256281407, -1.2, -0.202429149797574, -0.400000000000006, 
-0.301204819277106, -0.100704934541787, 0.403225806451604, 0, 
1.10441767068274, 0.0999999999999943, 1.59840159840161, 2.94985250737463, 
3.15186246418338, 0.55555555555555, 2.30202578268877, -0.0999999999999943, 
0.800800800800798, 0.496524329692155, 0.691699604743086, 0.196270853778203, 
0.685602350636634, -0.0999999999999943, 0, -0.100100100100109, 
-0.100200400801598, 0.100300902708119, 0.300601202404807, -0.799999999999997, 
0, -0.302419354838707, 0, 0.707785642062678, -0.200803212851394, 
-0.200000000000003, -0.200400801603209, -0.100401606425697, -0.201005025125631, 
0.201409869083588, 0.100502512562808, -0.200000000000003, -0.200400801603209, 
-0.100401606425697, -0.201005025125631, 0.201409869083588, 0.100502512562808, 
0, -0.299999999999997, -1.00300902708124, -0.303951367781152, 
0.711382113821127, 0.40363269424824, -0.00938085999999316, 0.00938174008789637, 
-0.196998120000003, -0.0751950428206875, 0.0470322689501711, 
0.047010148983195, -0.00938085999999316, 0.00938174008789637, 
-0.196998120000003, -0.0751950428206875, 0.0470322689501711, 
0.047010148983195), .Dim = c(6L, 15L), .Dimnames = list(c("1999-03-01", 
"1999-03-02", "1999-03-03", "1999-03-04", "1999-03-05", "1999-03-08"
), c("MSCI ACWI", "DJGlbl", "Russell 1000", "Russell Dev", "S&P GSCI Industrial ", 
"S&P GSCI Precious", "S&P GSCI Energy", "UBS Bloomberg", "iBoxx $ Liquid", 
"IBOXX ??? LQD", "iBoxx $ Liquid High Yield", "Markit IBOXX", 
"DBIQ Emerging", "Barclays US", "iBoxx Sov Euro IL")))
    , units = c("MSCI ACWI", "DJGlbl", "Russell 1000", "Russell Dev", "S&P GSCI Industrial ", 
"S&P GSCI Precious", "S&P GSCI Energy", "UBS Bloomberg", "iBoxx $ Liquid", 
"IBOXX ??? LQD", "iBoxx $ Liquid High Yield", "Markit IBOXX", 
"DBIQ Emerging", "Barclays US", "iBoxx Sov Euro IL")
    , positions = c(920246400, 920332800, 920419200, 920505600, 920592000, 920851200
)
    , format = "%Y-%m-%d"
    , FinCenter = "GMT"
    , recordIDs = structure(list(), .Names = character(0), row.names = integer(0), class = "data.frame")
    , title = "Time Series Object"
    , documentation = "Sun Oct 21 16:13:25 2012"
)

dput(head(df2))
new("timeSeries"
    , .Data = structure(c(0, 0.126304409, 0.074418121, -0.369527006, 0, 0.41879925, 
0.244385197, 0.067556211, 0.189228292, 0.086841066, 0, 0, 0, 
0, 0, 0.111750885, 0, 0, 0, 0, 0, 0, 0, 0, -0.88465521, 0.293946971, 
0.026972992, 0.245209764, 0, 0, 0.008522842, 0, -0.107155063, 
0, 1.941266205, -0.197897901, -0.013096887, 0, 0, 0.388013092, 
0.372488895, 0, -0.19041112, 0.136631233, 0, 0.183846748, 0.197612269, 
0, -0.002248848, 0.274449827, -0.143453619, -0.128428882, 0, 
0.144213551, -0.044105244, 0, -0.137138837, -0.074970085, 0, 
0, -0.128433675, 0.141883192, -0.052900591, -0.062071483, 0.062037765, 
0, -0.128433675, 0.141883192, -0.052900591, -0.062071483, 0.062037765, 
0, -0.133904169, 0.360826639, -0.040831396, -0.060762388, 0, 
0.129691732, 0.050392981, 0.020081642, 0.01978185, 0.030688482, 
0, 0.012962734, 0.050392981, 0.020081642, 0.01978185, 0.030688482, 
0, 0.012962734), .Dim = c(6L, 15L), .Dimnames = list(NULL, c("MSCI ACWI", 
"DJGlbl", "Russell 1000", "Russell Dev", "S&P GSCI Industrial ", 
"S&P GSCI Precious", "S&P GSCI Energy", "UBS Bloomberg", "iBoxx $ Liquid", 
"IBOXX ??? LQD", "iBoxx $ Liquid High Yield", "Markit IBOXX", 
"DBIQ Emerging", "Barclays US", "iBoxx Sov Euro IL")))
    , units = c("MSCI ACWI", "DJGlbl", "Russell 1000", "Russell Dev", "S&P GSCI Industrial ", 
"S&P GSCI Precious", "S&P GSCI Energy", "UBS Bloomberg", "iBoxx $ Liquid", 
"IBOXX ??? LQD", "iBoxx $ Liquid High Yield", "Markit IBOXX", 
"DBIQ Emerging", "Barclays US", "iBoxx Sov Euro IL")
    , positions = c(928195200, 930787200, 933552000, 936144000, 938736000, 941414400
)
    , format = "%Y-%m-%d"
    , FinCenter = "GMT"
    , recordIDs = structure(list(), .Names = character(0), row.names = integer(0), class = "data.frame")
    , title = "Time Series Object"
    , documentation = "Sun Oct 21 19:10:08 2012"
)

1 个答案:

答案 0 :(得分:1)

我认为这应该适用于你的timeSeries:

df1[rownames(df2), ] <- df2

这假定df2时间戳是df1中的时间戳的子集。如果不是这样,请使用交叉点:

replace.months <- intersect(rownames(df1), rownames(df2))
df1[replace.months, ] <- df2[replace.months, ]