使用dplyr实现data.table式的“隐式”过滤功能
用dplyr实现data.table的隐式过滤功能
Hi Alexander, 很高兴能帮你解决这个问题!你的原data.table代码核心是只在Cond == TRUE的行中计算Val的累积和,并将结果赋值给新列Res,不满足条件的行Res会自动保留为NA。下面是两种用dplyr实现完全相同效果的方法:
方法1:左连接法(逻辑直观,贴近data.table的筛选-计算逻辑)
先筛选出符合条件的行计算累积和,再通过左连接把结果合并回原表,确保非目标行的Res保持为NA:
library(dplyr) # 初始化数据框 df_test <- data.frame(Idx = c(1, 2, 3, 4, 5, 6, 7, 9), Cond = c(T, T, F, T, T,F, F, T), Val = c(T, T, F, T, T, F, T, T)) # 实现隐式过滤的累积和计算 df_test <- df_test %>% left_join( # 筛选Cond为TRUE的行,计算Val的累积和 df_test %>% filter(Cond) %>% mutate(Res = cumsum(Val)), # 按所有原始列连接,保证结果与原表行序完全对齐 by = c("Idx", "Cond", "Val") )
方法2:直接替换法(更简洁,模拟data.table的赋值逻辑)
先初始化Res列为NA,再精准替换Cond == TRUE位置的数值,完全复刻data.table的"隐式过滤赋值"逻辑:
df_test <- df_test %>% mutate(Res = NA) %>% # 先将Res列初始化为NA mutate(Res = replace(Res, Cond, cumsum(Val[Cond]))) # 仅对符合条件的行赋值
验证结果
运行上述任意一种方法后,你会得到和原data.table代码完全一致的结果:
| Idx | Cond | Val | Res |
|---|---|---|---|
| 1 | TRUE | TRUE | 1 |
| 2 | TRUE | TRUE | 2 |
| 3 | FALSE | FALSE | NA |
| 4 | TRUE | TRUE | 3 |
| 5 | TRUE | TRUE | 4 |
| 6 | FALSE | FALSE | NA |
| 7 | FALSE | TRUE | NA |
| 9 | TRUE | TRUE | 5 |
内容的提问来源于stack exchange,提问作者user12460590
相关产品推荐
相关产品推荐

