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

基于性别及性别-国家组合定制阈值的R语言数据分类代码开发需求

嘿,这就给你搞定两个符合需求的R代码变体,先放原始的数据集和基础分类代码方便对照,然后直接看解决方案:

原始数据集
df <- data.frame(PatientID = c("0002" ,"0002", "0005", "0005" ,"0009" ,"0009" ,"0018", "0018" ,"0039" ,"0039" , "0043" ,"0043", "0046", "0046" ,"0048" ,"0048"), 
                 Timepoint= c("A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B"), 
                 sex= c("F", "F", "M", "M", "F", "F", "M", "M","F", "F", "M", "M", "M", "M", "F", "F"), 
                 country= c("I", "I", "S", "S", "S", "S", "S", "S","S", "S", "I", "I", "I", "I", "I", "I"), 
                 A = c(NA , 977.146 , NA , 964.315 ,NA , 952.311 , NA , 950.797 , 947.465 , 902.852 , 985.124 ,NA , 930.141 ,1007.790 , 1027.110 , 999.414), 
                 B = c(998.988 , NA , 998.680 , NA , 1020.560 , 955.540 , 911.606 , 964.039 , 988.087 , 902.367 , 959.338 ,1029.050 , 987.374 ,1066.400 ,957.512 , 917.597), 
                 C = c( 987.140 , 961.810 , 929.466 , 978.166, 969.469 , 943.398 ,936.034, 965.292 , 996.404 , 920.610 , 967.047, 913.517 , 893.428 , 921.606 , 929.590 ,950.493), 
                 D = c( 961.810 , 929.466 , 978.166, 1005.820 , 925.752 , 969.469 ,943.398 , 965.292 , 996.404 , 967.047 , NA , 893.428 , 921.606 , 976.192 , 929.590 , 950.493), 
                 E = c(1006.330, 1028.070 , 954.274 ,1005.910 ,949.969 , 992.820 ,934.407 , 948.913 , 961.375 ,955.296 , 961.128 ,998.119 ,1009.110 , 994.891 ,1000.170 ,982.763), 
                 G= c(NA , 958.990 , 924.680 , 955.927 , NA , 949.384 ,973.348 , 984.392 , 943.894 , 961.468 , 995.368 , 994.997 , 979.454 , 952.605 ,NA , 956.507), 
                 stringsAsFactors = F)
基础分类代码
cols <- 5:10
df$Myo <- ifelse(rowSums(df[cols] > 1015, na.rm = TRUE) >= 3, 'Yes', 'No')

1. 按性别设置差异化阈值的分类代码

需求很明确:女性(df$sex=="F")用阈值1004,男性(df$sex=="M")用阈值986,只要第5-10列里有3列及以上超过对应性别阈值,就标记为"Yes",否则是"No"。

这里给你两种写法,推荐第二种向量化的,处理大数据集更快:

写法1:用apply逐行处理

cols <- 5:10
# 先给每行分配对应的性别阈值
df$threshold <- ifelse(df$sex == "F", 1004, 986)
# 逐行计算超过阈值的列数,再判断标记
df$Myo_sex <- apply(df[cols], 1, function(row) {
  # 匹配当前行的阈值
  current_threshold <- df$threshold[as.integer(names(row))]
  sum(row > current_threshold, na.rm = TRUE) >= 3
})
# 把布尔值转成"Yes"/"No"
df$Myo_sex <- ifelse(df$Myo_sex, "Yes", "No")

写法2:向量化处理(推荐)

cols <- 5:10
# 创建和数据集行数一致的阈值向量
thresholds <- ifelse(df$sex == "F", 1004, 986)
# 用sweep把每行的数值和对应阈值比较,再统计每行超过的数量
over_count <- rowSums(sweep(df[cols], 1, thresholds, FUN = ">"), na.rm = TRUE)
# 生成最终标记
df$Myo_sex <- ifelse(over_count >= 3, "Yes", "No")

2. 按性别与国家组合设置四类阈值的分类代码

四类阈值规则:

  • 瑞典(country=="S")的男性:阈值900
  • 瑞典(country=="S")的女性:阈值1016
  • 冰岛(country=="I")的男性:阈值800
  • 冰岛(country=="I")的女性:阈值1000

判断逻辑和之前一致,还是看第5-10列里≥3列超过对应组合阈值就标记"Yes"。

同样给你两种写法,一种用dplyr的case_when(可读性更高),一种用嵌套ifelse(不用额外包):

写法1:用dplyr::case_when(可读性强)

library(dplyr) # 需要先安装加载dplyr包

cols <- 5:10
# 匹配四类组合的阈值
df$threshold_comb <- case_when(
  df$country == "S" & df$sex == "M" ~ 900,
  df$country == "S" & df$sex == "F" ~ 1016,
  df$country == "I" & df$sex == "M" ~ 800,
  df$country == "I" & df$sex == "F" ~ 1000
)
# 向量化计算超过阈值的列数
over_count_comb <- rowSums(sweep(df[cols], 1, df$threshold_comb, FUN = ">"), na.rm = TRUE)
# 生成标记
df$Myo_comb <- ifelse(over_count_comb >= 3, "Yes", "No")

写法2:嵌套ifelse(无需额外包)

cols <- 5:10
# 嵌套ifelse匹配四类阈值
df$threshold_comb <- ifelse(df$country == "S",
                            ifelse(df$sex == "M", 900, 1016),
                            ifelse(df$sex == "M", 800, 1000))
# 计算超过数量并标记
over_count_comb <- rowSums(sweep(df[cols], 1, df$threshold_comb, FUN = ">"), na.rm = TRUE)
df$Myo_comb <- ifelse(over_count_comb >= 3, "Yes", "No")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 23:02:43