Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过在R中查找日期和正确的小数点来创建新变量_R_Dataframe_Subset - Fatal编程技术网

通过在R中查找日期和正确的小数点来创建新变量

通过在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

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公司;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)