使用dplyr::rowwise计算行和异常,哪里可查其使用限制相关资料?
问题原因分析
你自定义的get_from_df函数里的get(pos=df)直接读取了全局环境下的完整df对象的整列数据,没有识别到rowwise创建的行分组上下文。rowwise本质是把每行设为一个独立分组,在dplyr的data mask机制下,直接引用列名才会自动取当前行的对应值,而你用get调用绕过了data mask的识别,所以每次sum计算的是x整列和y整列的总和,所有行的计算结果自然都是310。
rowwise的运行逻辑
- rowwise是一种特殊的分组操作,生成的rowwise tibble每个分组仅包含原数据的一行
- 配套的
c_across()函数用来在rowwise上下文下动态选择多列,适配dplyr的非标准评估规则,会自动从当前行分组中取数 - 所有在mutate/filter等dplyr动词内的计算,默认都会使用data mask机制,优先读取当前分组内的列值,而非全局环境下的同名对象
对应使用限制说明
你遇到的是dplyr非标准评估的上下文适配问题:外部自定义的函数如果没有专门适配data mask,就无法自动识别当前分组的取值环境,只会从函数定义的环境(这里就是全局环境)找对应的对象,导致不符合预期的结果。
如果要在rowwise下实现动态列求和,正确的写法是:
df <- data.frame(x=1:10, y=21:30) l <- c('x', 'y') df %>% rowwise() %>% mutate(presum = sum(c_across(all_of(l))))
可查阅的官方文档
不需要跳转外部网站,直接在R环境中运行以下命令即可获取官方说明:
- 运行
?dplyr::rowwise查看rowwise的完整用法、实现逻辑和常见用例 - 运行
?dplyr::c_across查看rowwise下动态选列的配套函数说明 - 运行
?dplyr::data_mask查看dplyr非标准评估的核心机制说明,解释列名自动识别的底层逻辑
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

