R:按行列匹配
R: Matching by row and column
我有两个数据框,如下:
股权数据
ValuationDate Currency Opening Closing
02/01/2003 CHF 0 0
02/01/2003 DKK 0 0
03/01/2003 CHF 0 0
02/01/2003 SEK 0 0
03/01/2003 SEK 0 0
04/01/2003 SEK 0 0
05/01/2003 CHF 0 0
03/01/2003 DKK 0 0
其中包含有关每天以不同货币进行的交易的信息
和 HistoricalFX
Date CHF X DKK X.1 SEK X.2
02/01/2003 0.6885 0.688 0.1347 0.1346 0.1094 0.1096
03/01/2003 0.688 0.6858 0.1346 0.1345 0.1096 0.1099
04/01/2003 0.6858 0.6858 0.1345 0.1345 0.1099 0.1099
05/01/2003 0.6858 0.6858 0.1345 0.1345 0.1099 0.1099
其中包含历史外汇汇率,开盘价低于货币代码,收盘价在其旁边的栏中。
我正在尝试在 EquityData 数据框中获取相应的 FX 价格。
我试过以下方法,虽然有效,但显然效率很低:
openExchangeMatch = match(EquityData$Currency,colnames(HistoricalFX))
closeExchangeMatch = match(EquityData$Currency,colnames(HistoricalFX))+1
dateMatch = match(EquityData$ValuationDate,HistoricalFX$Date)
for (i in 1:nrow(EquityData))
{
EquityData$OpenExchange[i] = HistoricalFX[dateMatch[i],openExchangeMatch[i]]
EquityData$closeExchange[i] = HistoricalFX[dateMatch[i],closeExchangeMatch[i]]
}
关于如何更好地解决上述问题有什么想法吗?
我们在对第二个数据集('df2'即'HistoricalFX')进行子集化后创建一个row/column索引('indx1'),分配'Opening'和[=第一个数据集中的 20=] 列('df1' 即 'EquityData'),其值是我们在 'op1' 和 'cl1'[=12= 中使用 'indx1' 获得的值]
op1 <- df2[-1][c(TRUE, FALSE)]
cl1 <- df2[-1][c(FALSE, TRUE)]
names(cl1) <- names(op1)
indx1 <- cbind(match(df1$ValuationDate, df2$Date),
match(df1$Currency, names(op1)))
df1$Opening <- op1[indx1]
df1$Closing <- cl1[indx1]
df1
# ValuationDate Currency Opening Closing
#1 02/01/2003 CHF 0.6885 0.6880
#2 02/01/2003 DKK 0.1347 0.1346
#3 03/01/2003 CHF 0.6880 0.6858
#4 02/01/2003 SEK 0.1094 0.1096
#5 03/01/2003 SEK 0.1096 0.1099
#6 04/01/2003 SEK 0.1099 0.1099
#7 05/01/2003 CHF 0.6858 0.6858
#8 03/01/2003 DKK 0.1346 0.1345
数据
df1 <- structure(list(ValuationDate = c("02/01/2003", "02/01/2003",
"03/01/2003", "02/01/2003", "03/01/2003", "04/01/2003", "05/01/2003",
"03/01/2003"), Currency = c("CHF", "DKK", "CHF", "SEK", "SEK",
"SEK", "CHF", "DKK"), Opening = c(0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L), Closing = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("ValuationDate",
"Currency", "Opening", "Closing"), class = "data.frame", row.names = c(NA,
-8L))
df2 <- structure(list(Date = c("02/01/2003", "03/01/2003", "04/01/2003",
"05/01/2003"), CHF = c(0.6885, 0.688, 0.6858, 0.6858), X = c(0.688,
0.6858, 0.6858, 0.6858), DKK = c(0.1347, 0.1346, 0.1345, 0.1345
), X.1 = c(0.1346, 0.1345, 0.1345, 0.1345), SEK = c(0.1094, 0.1096,
0.1099, 0.1099), X.2 = c(0.1096, 0.1099, 0.1099, 0.1099)), .Names = c("Date",
"CHF", "X", "DKK", "X.1", "SEK", "X.2"), class = "data.frame", row.names = c(NA,
-4L))
我有两个数据框,如下:
股权数据
ValuationDate Currency Opening Closing
02/01/2003 CHF 0 0
02/01/2003 DKK 0 0
03/01/2003 CHF 0 0
02/01/2003 SEK 0 0
03/01/2003 SEK 0 0
04/01/2003 SEK 0 0
05/01/2003 CHF 0 0
03/01/2003 DKK 0 0
其中包含有关每天以不同货币进行的交易的信息 和 HistoricalFX
Date CHF X DKK X.1 SEK X.2
02/01/2003 0.6885 0.688 0.1347 0.1346 0.1094 0.1096
03/01/2003 0.688 0.6858 0.1346 0.1345 0.1096 0.1099
04/01/2003 0.6858 0.6858 0.1345 0.1345 0.1099 0.1099
05/01/2003 0.6858 0.6858 0.1345 0.1345 0.1099 0.1099
其中包含历史外汇汇率,开盘价低于货币代码,收盘价在其旁边的栏中。
我正在尝试在 EquityData 数据框中获取相应的 FX 价格。
我试过以下方法,虽然有效,但显然效率很低:
openExchangeMatch = match(EquityData$Currency,colnames(HistoricalFX))
closeExchangeMatch = match(EquityData$Currency,colnames(HistoricalFX))+1
dateMatch = match(EquityData$ValuationDate,HistoricalFX$Date)
for (i in 1:nrow(EquityData))
{
EquityData$OpenExchange[i] = HistoricalFX[dateMatch[i],openExchangeMatch[i]]
EquityData$closeExchange[i] = HistoricalFX[dateMatch[i],closeExchangeMatch[i]]
}
关于如何更好地解决上述问题有什么想法吗?
我们在对第二个数据集('df2'即'HistoricalFX')进行子集化后创建一个row/column索引('indx1'),分配'Opening'和[=第一个数据集中的 20=] 列('df1' 即 'EquityData'),其值是我们在 'op1' 和 'cl1'[=12= 中使用 'indx1' 获得的值]
op1 <- df2[-1][c(TRUE, FALSE)]
cl1 <- df2[-1][c(FALSE, TRUE)]
names(cl1) <- names(op1)
indx1 <- cbind(match(df1$ValuationDate, df2$Date),
match(df1$Currency, names(op1)))
df1$Opening <- op1[indx1]
df1$Closing <- cl1[indx1]
df1
# ValuationDate Currency Opening Closing
#1 02/01/2003 CHF 0.6885 0.6880
#2 02/01/2003 DKK 0.1347 0.1346
#3 03/01/2003 CHF 0.6880 0.6858
#4 02/01/2003 SEK 0.1094 0.1096
#5 03/01/2003 SEK 0.1096 0.1099
#6 04/01/2003 SEK 0.1099 0.1099
#7 05/01/2003 CHF 0.6858 0.6858
#8 03/01/2003 DKK 0.1346 0.1345
数据
df1 <- structure(list(ValuationDate = c("02/01/2003", "02/01/2003",
"03/01/2003", "02/01/2003", "03/01/2003", "04/01/2003", "05/01/2003",
"03/01/2003"), Currency = c("CHF", "DKK", "CHF", "SEK", "SEK",
"SEK", "CHF", "DKK"), Opening = c(0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L), Closing = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("ValuationDate",
"Currency", "Opening", "Closing"), class = "data.frame", row.names = c(NA,
-8L))
df2 <- structure(list(Date = c("02/01/2003", "03/01/2003", "04/01/2003",
"05/01/2003"), CHF = c(0.6885, 0.688, 0.6858, 0.6858), X = c(0.688,
0.6858, 0.6858, 0.6858), DKK = c(0.1347, 0.1346, 0.1345, 0.1345
), X.1 = c(0.1346, 0.1345, 0.1345, 0.1345), SEK = c(0.1094, 0.1096,
0.1099, 0.1099), X.2 = c(0.1096, 0.1099, 0.1099, 0.1099)), .Names = c("Date",
"CHF", "X", "DKK", "X.1", "SEK", "X.2"), class = "data.frame", row.names = c(NA,
-4L))