我得到了两个数据帧,如下所示:
数据框1
individual OpenDate CloseDate MeanReturn
1 1 2010-01-04 2010-01-08 NaN
2 2 2010-01-01 2010-01-08 NaN
3 3 2010-01-03 2010-01-06 NaN
4 4 2010-01-02 2010-01-05 NaN
5 5 2010-01-04 2010-01-06 NaN
和dataframe2
Date Return
1 2010-01-01 532
2 2010-01-02 645
3 2010-01-03 213
4 2010-01-04 567
5 2010-01-05 986
6 2010-01-06 123
7 2010-01-07 567
8 2010-01-08 654
我需要做的是以某种方式计算每个个体的MeanReturn,例如对于个体5:MeanReturn =(567 + 986 + 123)/ 3
我的真实数据由10,000多名个人组成,期限为2年,所以不幸的是,这并非一件容易的事。
我已经在这个问题上停留了将近两个星期,这让我发疯了-关于如何解决这个问题的任何建议?
由于第二个数据帧的返回值按排序Date
,我们可以使用它match
来求Return
平均值的范围:
df1$MeanReturn=mapply(function(o,c) mean(df2$Return[o:c]), match(df1$OpenDate,df2$Date), match(df1$CloseDate,df2$Date))
在这里,我们mapply
将mean
函数应用于分别df2
与df1$OpenDate
和匹配的第二个数据帧中的打开和关闭行df1$CloseDate
。
使用您提供的数据df1
将变为:
df1
## individual OpenDate CloseDate MeanReturn
##1 1 2010-01-04 2010-01-08 579.4000
##2 2 2010-01-01 2010-01-08 535.8750
##3 3 2010-01-03 2010-01-06 472.2500
##4 4 2010-01-02 2010-01-05 602.7500
##5 5 2010-01-04 2010-01-06 558.6667
数据:
df1 <- structure(list(individual = 1:5, OpenDate = structure(c(4L, 1L,
3L, 2L, 4L), .Label = c("2010-01-01", "2010-01-02", "2010-01-03",
"2010-01-04"), class = "factor"), CloseDate = structure(c(3L,
3L, 2L, 1L, 2L), .Label = c("2010-01-05", "2010-01-06", "2010-01-08"
), class = "factor"), MeanReturn = c(579.4, 535.875, 472.25,
602.75, 558.666666666667)), .Names = c("individual", "OpenDate",
"CloseDate", "MeanReturn"), row.names = c(NA, -5L), class = "data.frame")
## individual OpenDate CloseDate MeanReturn
##1 1 2010-01-04 2010-01-08 579.4000
##2 2 2010-01-01 2010-01-08 535.8750
##3 3 2010-01-03 2010-01-06 472.2500
##4 4 2010-01-02 2010-01-05 602.7500
##5 5 2010-01-04 2010-01-06 558.6667
df2 <- structure(list(Date = structure(1:8, .Label = c("2010-01-01",
"2010-01-02", "2010-01-03", "2010-01-04", "2010-01-05", "2010-01-06",
"2010-01-07", "2010-01-08"), class = "factor"), Return = c(532L,
645L, 213L, 567L, 986L, 123L, 567L, 654L)), .Names = c("Date",
"Return"), class = "data.frame", row.names = c(NA, -8L))
## Date Return
##1 2010-01-01 532
##2 2010-01-02 645
##3 2010-01-03 213
##4 2010-01-04 567
##5 2010-01-05 986
##6 2010-01-06 123
##7 2010-01-07 567
##8 2010-01-08 654
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句