如何在自定义函数中传递tidyr::uncount的.remove参数使其生效?
问题解决:自定义uncount封装函数中.remove参数失效的修复
问题原因
你的自定义函数one2many2存在两个关键问题:
- 函数定义中未声明
.remove参数,导致调用时传入的.remove = TRUE被直接忽略 - 调用
uncount()时,直接传递data[, var]的列值,未正确将.remove参数传递给uncount()本身,也没有按tidyverse规范引用列名
修复后的函数
调整函数,添加.remove参数并按规范传递参数:
library(tidyr) library(dplyr) one2many2 <- function(data, var, .remove = TRUE) { data %>% mutate(rows = row_number()) %>% uncount(weights = .data[[var]], .remove = .remove) }
测试验证
用你的测试数据验证效果:
a <- data.frame(name = c("Maria", "Tina"), age = c(5, 3)) # 默认移除计数列(age) one2many2(a, "age") # 输出包含name、rows列,无age列 # 保留计数列 one2many2(a, "age", .remove = FALSE) # 输出包含name、rows、age列
补充说明
- 使用
.data[[var]]可以正确引用字符串形式传入的列名,符合tidyeval语法规范 - 显式声明
.remove参数并设置默认值TRUE,与uncount()的原生默认行为保持一致,调用时可灵活切换是否保留原计数列
内容的提问来源于stack exchange,提问作者Salvador
相关产品推荐
相关产品推荐

