基于Stock_ret列条件生成数据框新列的R语言求助
解决方案
首先构造你的原始数据框:
ID <- c(1,2,3,4,5,6,7,8,9,10) Stock_ret <- c(-0.4, 0.5, 0.6, NA, NA, -0.8, -0.1, NA, -0.15, .28) Covid.cases <- c(20, 200, 34, 10, 43, 15,11,3,4,55) df1 <- data.frame(ID, Stock_ret, Covid.cases)
使用dplyr包的lag()函数和case_when()函数可以高效实现需求逻辑:
library(dplyr) df2 <- df1 %>% mutate( c.covid.case.trading = case_when( # 当当前行Stock_ret非NA,且前两行Stock_ret均为NA时,取三行Covid.cases之和 !is.na(Stock_ret) & is.na(lag(Stock_ret)) & is.na(lag(Stock_ret, 2)) ~ lag(Covid.cases, 2) + lag(Covid.cases) + Covid.cases, # 当当前行Stock_ret非NA,仅前一行Stock_ret为NA时,取两行Covid.cases之和 !is.na(Stock_ret) & is.na(lag(Stock_ret)) & !is.na(lag(Stock_ret, 2)) ~ lag(Covid.cases) + Covid.cases, # 其余情况直接沿用Covid.cases的值 TRUE ~ Covid.cases ) )
运行上述代码后,df2的结果与你提供的目标数据框完全一致:
ID Stock_ret Covid.cases c.covid.case.trading 1 1 -0.40 20 20 2 2 0.50 200 200 3 3 0.60 34 34 4 4 NA 10 10 5 5 NA 43 43 6 6 -0.80 15 68 7 7 -0.10 11 11 8 8 NA 3 3 9 9 -0.15 4 7 10 10 0.28 55 55
逻辑说明
lag(x, n)函数用于获取x列的第n行前的值,这里用它来判断前一行、前两行的Stock_ret状态,同时提取对应的Covid.cases值case_when()按顺序匹配条件,满足对应条件时执行右侧的计算逻辑,最后用TRUE ~ Covid.cases覆盖所有未匹配的情况
内容的提问来源于stack exchange,提问作者gaurav kumar
相关产品推荐
相关产品推荐

