R包开发:替换dplyr函数解决stats与dplyr导入冲突警告
解决R包构建中dplyr与stats函数冲突警告的base R替代实现
问题背景
构建自定义R包critpath时出现以下导入冲突警告:
Warning: replacing previous import 'dplyr::lag' by 'stats::lag' when loading 'critpath'
Warning: replacing previous import 'dplyr::filter' by 'stats::filter' when loading 'critpath'
该问题在添加一段dplyr分组处理代码后出现,尝试调整Description导入顺序、使用importFrom、conflicted包均无法消除警告,因此需要用base R替代原dplyr代码。
原dplyr代码逻辑:
temp_df <- temp_df %>% group_by(Step2Col3, Step5Col4) %>% mutate(num_dups = n(), dup_id = row_number()) %>% ungroup() %>% mutate(is_duplicated = dup_id > 1)
示例数据:
temp_df <- data.frame(Activity = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"), Step2Col3 = c(1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 9), Step5Col4 = c(2, 3, 4, 5, 6, 6, 6, 7, 8, 8, 8, 9, 10))
base R替代实现
以下代码完全用base R实现原dplyr的逻辑,无需依赖dplyr包,彻底避免函数冲突:
# 按Step2Col3和Step5Col4分组,计算每组的行数(对应num_dups) temp_df$num_dups <- ave(rep(1, nrow(temp_df)), temp_df$Step2Col3, temp_df$Step5Col4, FUN = length) # 生成每组内的行号(对应dup_id) temp_df$dup_id <- ave(rep(1, nrow(temp_df)), temp_df$Step2Col3, temp_df$Step5Col4, FUN = seq_along) # 标记是否为重复项(对应is_duplicated) temp_df$is_duplicated <- temp_df$dup_id > 1
逻辑对应说明
ave(..., FUN = length):替代group_by() %>% mutate(num_dups = n()),按指定分组变量计算每组的观测数量ave(..., FUN = seq_along):替代group_by() %>% mutate(dup_id = row_number()),为每个分组生成从1开始的递增行号- 直接通过
dup_id > 1生成重复标记列,逻辑与原代码完全一致
运行上述代码后,得到的temp_df与原dplyr代码处理后的结果完全相同,同时消除了函数冲突的构建警告。
内容的提问来源于stack exchange,提问作者tygrysuav
相关产品推荐
相关产品推荐

