通过在R中查找日期和正确的小数点来创建新变量
R中的这个问题一周来就让我发疯了,所以我真的很高兴能得到任何帮助:我有一个大数据框架,股票估值率约为100.000,我希望通过创建一个新变量“BM_Portfolio”,每年将每只股票分配到10个投资组合中的一个基于我每年在第二个数据帧(称为BP)中计算的十进制数 这是1。数据框“CCM2\u六月\u所有股票”,包括所有估值比率: 日期;股票做我自己通过在R中查找日期和正确的小数点来创建新变量,r,dataframe,subset,R,Dataframe,Subset,R中的这个问题一周来就让我发疯了,所以我真的很高兴能得到任何帮助:我有一个大数据框架,股票估值率约为100.000,我希望通过创建一个新变量“BM_Portfolio”,每年将每只股票分配到10个投资组合中的一个基于我每年在第二个数据帧(称为BP)中计算的十进制数 这是1。数据框“CCM2\u六月\u所有股票”,包括所有估值比率: 日期;股票做我自己 2011-06-30; TELENAV公司;0.38 2012-06-30; TELENAV公司;0.30 2013-06-30; TELENAV
2011-06-30; TELENAV公司;0.38
2012-06-30; TELENAV公司;0.30
2013-06-30; TELENAV公司;0.56
这是2。每年带小数点(=断点)的数据帧“BP”:
日期;成为我的10%;比我高20%;比我高30%;比我高40%;比我高50%;等
2011-06-30; TELENAV公司;0.20; 0.29; 0.37; 0.44; 0.53等
2012-06-30; TELENAV公司;0.22; 0.27; 0.36; 0.45; 0.55等
2013-06-30; TELENAV公司;0.24; 0.30; 0.34; 0.46; 0.57等
我的代码将每只股票分配给一个投资组合,但有时投资组合编号错误为-1或+1:
CCM2_June_all_stocks$BM_Portfolio <- ifelse(CCM2_June_all_stocks$Date %in% BP$Date & CCM2_June_all_stocks$BE_ME_Dec <= BP$X10., 1,
ifelse(CCM2_June_all_stocks$Date %in% BP$Date & CCM2_June_all_stocks$BE_ME_Dec <= BP$X20., 2,
ifelse(CCM2_June_all_stocks$Date %in% BP$Date & CCM2_June_all_stocks$BE_ME_Dec <= BP$X30., 3,
ifelse(CCM2_June_all_stocks$Date %in% BP$Date & CCM2_June_all_stocks$BE_ME_Dec <= BP$X40., 4,
ifelse(CCM2_June_all_stocks$Date %in% BP$Date & CCM2_June_all_stocks$BE_ME_Dec <= BP$X50., 5,
ifelse(CCM2_June_all_stocks$Date %in% BP$Date & CCM2_June_all_stocks$BE_ME_Dec <= BP$X60., 6,
ifelse(CCM2_June_all_stocks$Date %in% BP$Date & CCM2_June_all_stocks$BE_ME_Dec <= BP$X70., 7,
ifelse(CCM2_June_all_stocks$Date %in% BP$Date & CCM2_June_all_stocks$BE_ME_Dec <= BP$X80., 8,
ifelse(CCM2_June_all_stocks$Date %in% BP$Date & CCM2_June_all_stocks$BE_ME_Dec <= BP$X90., 9, 10)))))))))
CCM2\u June\u所有股票$BM\u投资组合您可能想要这样的东西:
BM_Merged <- merge(CCM2_June_all_stocks, BP, by=c("Date", "stock"))
Portfolio <- apply(BM_Merged, 1, function(x)match(TRUE, x[3] <= x[-(1:3)]))
BM_Result <- cbind(BM_Merged[, 1:3], BM_Portfolio=Portfolio)
BM_合并感谢Knackiedoo<代码>合并
在这里不起作用,因为两个数据帧都非常不同:大型数据帧“CCM2_June_all_stocks”有超过100000行,其中stock xyz的B/M比率为。小数据框“BP”只有30行(从1985年到2015年的30年)和10列,每年的B/M比率以十分位数为边界
所以我认为工作流应该类似于1。对于大数据框中的每个日期,在数据框“BP”中查找具有相同日期的行,2。检查BM比率适用的BM十分位数,3。根据十分位数分配投资组合编号1-10。有什么想法吗?第一点正是合并所做的。当你尝试时会发生什么?我认为您可能在一个或其他文件中有多个股票,所以它也匹配这些股票。如果您想忽略股票,那么只需在合并中忽略它。如果您可以输出一些数据(显然不是全部100000行!),那么这会有所帮助。非常感谢您的努力。我的一位同事能够用两个循环来解决这个问题:CCM\u DT=data.table(CCM2\u June\u all\u stocks)
CCM\u DT[,YEAR:=YEAR(Date)]
BP\u DT=data.table(BP)
BP\u DT[,YEAR]
CCM\u DT[,DEC:=0]
key(CCM,YEAR,BE-DEC)
setkey(BP_DT,YEAR)
for(i in 1:length(years)){for(j in 1:10){if(j==1){CCM_DT[YEAR==years[i]&BE_ME_Dec
BM_Merged <- merge(CCM2_June_all_stocks, BP, by=c("Date", "stock"))
Portfolio <- apply(BM_Merged, 1, function(x)match(TRUE, x[3] <= x[-(1:3)]))
BM_Result <- cbind(BM_Merged[, 1:3], BM_Portfolio=Portfolio)