【发布时间】:2019-12-13 12:31:16
【问题描述】:
我有一个包含以下列的基本数据框:
Base <- data.frame(Currency = c("EUR.", "EUR.", "USD.", "USD.", "GBP."), Quantity = c(393858,597184,673522,110204,38051625), Price_local = c(168,119.2,168.29,1221.14,1.45), FX_rate = c(1.0898, 1.0898, 1, 1, 1.2287), Exposure.USD = c(72110043,77576686,113347017,134574513,67723215))
我有另一个名为 FX_Stress 的数据框,由以下列组成:
FX_Stress <- data.frame(V1 = c("FXDown5", FXDown10", "FXUp5", "FXUp10"), V2 = c(0.95,0.90,1.05,1.10))
我想要的是将新列添加到具有 FX_Stress 数据帧第一列的列名的基本数据帧,即 FXDown5、FXDown10、FXUp5 和 FXUp10。此外,我希望这些新列由特定公式填充。例如,对于新列 Base$FXDown5,公式为:
Base$FXDown5 <- ifelse(Base$Currency == "USD.", 0, ((1/((1/Base$FX_rate)*0.95))*(Base$Price_local)*Base$Quantity)-Base$Exposure.USD)
上面公式中使用的0.95是从FX_Stress中的V2列得到的,对应于V1列中的FXDown5。这是这样工作的,新列 Base$FXDown5 下的正确值是 3795265.77、4082983.35、0、0、3638201.71。但是我必须填写很多列,我不能为每个新列编写一个新公式。因此,我尝试使用 lapply 函数一次填充所有新列。这些在下面提到:
Base[FX_Stress[,1]] <- 0
Base[FX_Stress[,1]] <- lapply(Base[FX_Stress[,1]], function(x) {ifelse(Base$Currency == "USD.", 0, ((1/((1/Base$FX_rate)* FX_Stress$V2[match(names(x), FX_Stress$V1)]))*(Base$Price_local)*Base$Quantity)-Base$Exposure.USD)})
但在输出中,我得到了非美元货币的 NA 值。 (对于美元。货币为 0,这是正确的)。如果我为每列单独执行它,那么它会正确出现,但是当我使用 lapply 匹配列名时,NA 值将用于非美元的货币。任何人都可以帮助了解我用来立即为新列获取正确值的 lapply 公式。这可以通过使用 dplyr 和诸如收集和传播之类的功能来完成,但我会请求有关如何使用 lapply/sapply 完成它的帮助。
【问题讨论】: