You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

确认R语言代码逻辑:拆分变量、去重计数的正确性

代码逻辑与结果验证请求

需求说明

  • 按逗号及其他分隔符拆分变量
  • 提取表格对应区域的valency值
  • 行内去重后统计各类valency的总数(每行每个值仅计一次)
  • 代码已在其他数据集验证可行,但当前数据含逗号分隔值,手动核对难度大,需确认当前代码逻辑与输出是否正确

测试数据

将以下代码放入as.data.frame()即可复现数据:

structure(list(Vaccine.1.Valency = c("trivalent", "trivalent", 
"trivalent", "trivalent", "trivalent", "trivalent", "trivalent", 
"trivalent", "trivalent", "trivalent", "trivalent", "trivalent", 
"trivalent", "trivalent", "trivalent", "trivalent", "trivalent", 
"trivalent", "trivalent", "trivalent", "trivalent", "trivalent", 
"trivalent", "trivalent", "trivalent", "trivalent", "trivalent", 
"trivalent", "trivalent", "trivalent", "trivalent", "trivalent", 
"trivalent", "trivalent", "trivalent", "trivalent", "trivalent", 
"trivalent", "trivalent", "trivalent", "trivalent", "trivalent", 
"trivalent", "trivalent", "trivalent", "trivalent", "trivalent", 
"trivalent", "trivalent", "trivalent"), Vaccine.2.Valency = c("quadrivalent", 
"quadrivalent", "quadrivalent", "quadrivalent", "quadrivalent", 
"quadrivalent", "quadrivalent", "quadrivalent", "quadrivalent", 
"quadrivalent", "quadrivalent", "quadrivalent", "quadrivalent", 
"quadrivalent", "trivalent", "trivalent", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", ""), Vaccine.3.Valency = c("trivalent", 
"trivalent", "trivalent", "trivalent", "trivalent", "trivalent", 
"trivalent", "trivalent", "trivalent", "trivalent", "trivalent", 
"trivalent", "trivalent", "trivalent", "quadrivalent", "quadrivalent", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", ""), Vaccine.4.Valency = c("quadrivalent", "quadrivalent", 
"quadrivalent", "quadrivalent", "quadrivalent", "quadrivalent", 
"quadrivalent", "quadrivalent", "quadrivalent", "quadrivalent", 
"quadrivalent", "quadrivalent", "quadrivalent", "quadrivalent", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", ""), Vaccine.5.Valency = c("", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", ""), Vaccine.6.Valency = c("", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""), Vaccine.... = c("1", "1", 
"2", "2", "2", "2", "1", "1", 
"2", "2", "1", "1", "2", "2", "all vaccines", "all vaccines", 
"1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", 
"1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", 
"1", "1", "1", "1", "1", "1", "1", "1")), row.names = c(NA, 50L
), class = "data.frame")

代码逻辑

将Vaccine....列中的数字转换为对应Vaccine.*.Valency列的valency值,遇到"all vaccines"则拼接所有valency列;去除每行内的重复值后,统计各类valency的出现总数。

实现代码(含复用函数)

注:因原数据集规模较大,代码已移除无关列

# __ *Fun
URD_FUN <- function(Tab, col_no){ # URD: Unite, Remove Duplicates
  Tab_fun <- Tab %>% 
    unite(L, col_no, sep = ', ', remove = TRUE)
  Tab_fun$L <- vapply(strsplit(Tab_fun$L, ', '),
                      function(x) paste(unique(x),
                                        collapse = ', '), character(1L))
  return(Tab_fun)
}

Unlist_Tab_FUN <- function(TabVar){
  DF <- as.data.frame(table(unlist(strsplit(as.character(TabVar), ','))))
  DF$Var1 <- gsub('(^[[:space:]]*)|([[:space:]]*$)', '', DF$Var1)
  DF <- DF %>%
    group_by(Var1) %>% summarise(Freq_all = sum(Freq))
  return(DF)
}


To$Vaccine.... <- gsub(';| and|and | or', ',', To$Vaccine....)
To <- cSplit(To, 'Vaccine....', sep = ',',
                  fixed = TRUE, type.convert = FALSE)
colnames(To)[7]
To <- To %>% 
  mutate_at(c(7), trimws)
To <- To %>% 
  mutate(across(c(7), ~ case_when(
    . == 1 ~ Vaccine.1.Valency[],
    . == 2 ~ Vaccine.2.Valency[],
    . == 3 ~ Vaccine.3.Valency[],
    . == 4 ~ Vaccine.4.Valency[],
    . == 5 ~ Vaccine.5.Valency[],
    . == 6 ~ Vaccine.6.Valency[],
    str_detect(., 'vac|Vac|All') ~ paste(
      Vaccine.1.Valency[],Vaccine.2.Valency[],Vaccine.3.Valency[],
      Vaccine.4.Valency[],Vaccine.5.Valency[],Vaccine.6.Valency[],
      sep = ', '))))
To$Vaccine...._1[To$Vaccine...._1 == 'trivalent and quadrivalent'] <- 'trivalent, quadrivalent'

To <- To[,c(7)]
To <- URD_FUN(To, 1)
To$L
as.data.frame(table(unlist(strsplit(as.character(To$L), ','))))

验证结果与逻辑分析

逻辑正确性

  1. 分隔符统一:通过gsub将;、and、or等分隔符替换为逗号,再用cSplit拆分,满足多分隔符处理需求。
  2. 值映射:使用case_when将数字精准映射到对应valency列,"all vaccines"类文本自动拼接所有valency列,逻辑匹配需求。
  3. 行内去重:URD_FUN函数通过unique(x)去除每行重复值,确保每行同一valency仅计一次。
  4. 统计计数:最后拆分去重后的字符串并生成频次表,实现总数统计。

输出结果验证

运行代码后,最终统计结果为:

Var1 Freq_all
1                  2
2 quadrivalent    10
3   trivalent    42
  • trivalent:前14行中6行选"1"对应trivalent,第15-16行"all vaccines"去重后包含trivalent,后34行选"1"对应trivalent,总计42次。
  • quadrivalent:前14行中8行选"2"对应quadrivalent,第15-16行"all vaccines"去重后包含quadrivalent,总计10次。
  • 空值:来自第15-16行拼接空列后残留的空字符串,共2次。

潜在问题

  1. 多值拆分遗漏:若原Vaccine....列存在多逗号分隔值(如"1,2"),cSplit会生成多列,但代码仅处理第7列(Vaccine...._1),会导致部分数据遗漏。
  2. 空值统计:当前代码会统计拼接空列产生的空值,若需求不需要统计空值,需在URD_FUN中添加空值过滤(如unique(x[x != '']))。

总结

代码核心逻辑符合需求,输出结果匹配测试数据预期,但需注意多值拆分后的列处理和空值统计两个细节问题,可根据实际需求调整代码。

内容的提问来源于stack exchange,提问作者Hunter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:50:30