R语言dplyr管道操作如何基于条件选择函数完成列转换
错误原因
你当前返回的是%>%构建的函数序列对象,没有将管道传递的.数据传入执行,因此不会返回计算后的数据框。
修复方案
方案1:直接在分支内操作数据(最直观)
直接对管道传入的.执行mutate,不需要额外生成函数序列:
library(dplyr) DF = data.frame('A' = 1:3, 'B' =2:4) Condition = 'A' fn1 = function(x) x + 3 fn2 = function(x) x + 5 DF %>% mutate('aa' = 3:5) %>% {if (Condition == 'A') { mutate(., 'A1' = fn1(A), 'B1' = fn1(B)) } else { mutate(., 'A1' = fn2(A), 'B1' = fn2(B)) } }
方案2:调用生成的函数序列
如果需要保留生成函数序列的写法,在返回前调用函数并传入当前数据.即可:
DF %>% mutate('aa' = 3:5) %>% {if (Condition == 'A') { bb = . %>% mutate('A1' = fn1(A), 'B1' = fn1(B)) bb(.) } else { bb = . %>% mutate('A1' = fn2(A), 'B1' = fn2(B)) bb(.) } }
方案3:提前选择转换函数(最简洁易读)
避免在管道中间写分支逻辑,提前根据Condition确定要使用的转换函数,代码可读性更高:
library(dplyr) DF = data.frame('A' = 1:3, 'B' =2:4) Condition = 'A' fn1 = function(x) x + 3 fn2 = function(x) x + 5 # 提前确定转换函数 trans_fn = if (Condition == 'A') fn1 else fn2 DF %>% mutate(aa = 3:5) %>% mutate(A1 = trans_fn(A), B1 = trans_fn(B))
内容的提问来源于stack exchange,提问作者Bogaso
相关产品推荐
相关产品推荐

