R中基于条件提取上一行Close值替换当前Open列数据的实现问题
解决方案
你可以通过dplyr包的lag()函数直接获取上一行的收盘价,配合向量化判断即可实现需求,不需要写逐行判断的if语句,完整实现代码如下:
步骤1:加载依赖包与构造原始数据
library(tidyverse) # 你的原始数据集 data <- tribble( ~Date, ~Ticker, ~Close, ~Open, "1989-09-11","COND",77.3292,77.3292, "1989-09-12","COND",77.4435,77.4435, "1989-09-13","COND",76.3118,76.3118, "1989-09-14","COND",75.5309,75.6344, "1989-09-15","COND",75.6598,75.4675 )
步骤2:数据处理
data_processed <- data %>% # 按股票代码分组,多股票场景下不会跨行取值 group_by(Ticker) %>% # 按日期升序排序,保证行顺序符合时间逻辑 arrange(Date, .by_group = TRUE) %>% mutate( Open = if_else( # 浮点数比较用near避免精度误差,不需要可以换成 Open == Close condition = near(Open, Close), true = lag(Close), false = Open ) ) %>% ungroup()
处理后输出结果
> data_processed # A tibble: 5 × 4 Date Ticker Close Open <chr> <chr> <dbl> <dbl> 1 1989-09-11 COND 77.3 NA 2 1989-09-12 COND 77.4 77.3 3 1989-09-13 COND 76.3 77.4 4 1989-09-14 COND 75.5 75.6 5 1989-09-15 COND 75.7 75.5
注意事项
lag()函数默认取当前分组内上一行的指定列值,第一行没有上一行数据自动返回NA,和你的预期一致- 若你的数据集包含多个股票代码,
group_by(Ticker)是必须的,否则会出现跨股票取值的逻辑错误 - 浮点数直接用
==判断可能出现精度误差,使用near()函数可以规避该问题
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

