如何无需循环基于字符串反转数据框FX.SPOT列的数值?
问题:无需遍历高效替换数据框指定条件的FX.SPOT值
我希望找到一种无需遍历数据的简便方法,基于字符串条件替换数据框中FX.SPOT列的数值。
数据结构
test = structure(list(FX.QUOTATION = c("AUD-USD", "JPY-USD", "AUD-USD", "AUD-USD", "AUD-USD", "AUD-USD"), CURRENCY = c("AUD", "JPY", "AUD", "AUD", "AUD", "AUD"), FX.SPOT = c(0.7016, 115.455, 0.7016, 0.7016, 0.7016, 0.7016)), row.names = c(NA, 6L), class = "data.frame")
需求
将FX.QUOTATION等于'JPY-USD'的FX.SPOT值转换为-1/FX.SPOT。
尝试过的无效代码
within(test, FX.SPOT[FX.QUOTATION %in% 'JPY-USD'] <- -1/FX.SPOT)
高效解决方案
1. 基础R向量化修正
你之前的代码失效是因为赋值右侧的FX.SPOT是整列数据,而非仅筛选后的目标子集。修正后写法:
# 直接子集赋值 test$FX.SPOT[test$FX.QUOTATION == "JPY-USD"] <- -1 / test$FX.SPOT[test$FX.QUOTATION == "JPY-USD"] # 或用transform函数更简洁 test <- transform(test, FX.SPOT = ifelse(FX.QUOTATION == "JPY-USD", -1/FX.SPOT, FX.SPOT))
2. dplyr(tidyverse风格)
习惯tidyverse语法的话,用mutate结合if_else实现向量化修改:
library(dplyr) test <- test %>% mutate(FX.SPOT = if_else(FX.QUOTATION == "JPY-USD", -1/FX.SPOT, FX.SPOT))
3. data.table(大数据场景首选)
处理大型数据集时,data.table的原地修改效率最高:
library(data.table) setDT(test)[FX.QUOTATION == "JPY-USD", FX.SPOT := -1/FX.SPOT]
以上方法均为向量化操作,无需逐行遍历,效率远高于循环处理。基础R写法无需额外安装包,data.table在大数据量下性能最优。
内容的提问来源于stack exchange,提问作者nicshah
相关产品推荐
相关产品推荐

