根据 R 中的一系列分类变量重新编码数值变量

Posted

技术标签:

【中文标题】根据 R 中的一系列分类变量重新编码数值变量【英文标题】:Recode a numeric variable based on a range of categorical variables in R 【发布时间】:2019-04-01 18:59:40 【问题描述】:

不幸的是,我正在努力弄清楚如何根据一系列分类变量(缺少值)创建一个新变量。

我有以下数据集(模拟数据)

df = data.frame(ID = c(1001, 1002, 1003, 1004, 1005,1006,1007,  1008,1009,1010,1011),
                    Disease_code_1 = c('I802', 'H356','G560','D235', 'B178', 'F011', 'F023', 'C761', 'H653', 'A049', 'J679'),
                    Disease_code_2 = c('A071','NA','G20','NA','NA', 'A049','NA', 'NA','G300','G308','A045'),
                    Disease_code_3 = c('H250', 'NA','NA','I802','NA', 'A481', 'NA','NA','NA','NA','D352'))

这给出了:

     ID Disease_code_1 Disease_code_2 Disease_code_3
1  1001           I802           A071           H250
2  1002           H356             NA             NA
3  1003           G560            G20             NA
4  1004           D235             NA           I802
5  1005           B178             NA             NA
6  1006           F011           A049           A481
7  1007           F023             NA             NA
8  1008           C761             NA             NA
9  1009           H653           G300             NA
10 1010           A049           G308             NA
11 1011           J679           A045           D352

我想创建一个新变量,为具有疾病代码子集(例如 F023、G20、G300)的人分配 1(存在疾病)。我试图按照以前回答的堆栈溢出问题进行有限的成功:

df$test <- NA
df$test <-sapply(df[ , 2:4] , 
                 FUN = function(x) recode(x, "'G20' =1; 'G300' =1",
                                          as.factor.result=FALSE))

这会导致错误:

 Error: Argument 2 must be named, not unnamed 

理想情况下,我希望我的数据集如下所示:

     ID Disease_code_1 Disease_code_2 Disease_code_3 Disease_present
1  1001           I802           A071           H250               0
2  1002           H356             NA             NA               0
3  1003           G560            G20             NA               1
4  1004           D235             NA           I802               0
5  1005           B178             NA             NA               0
6  1006           F011           A049           A481               0
7  1007           F023             NA             NA               0
8  1008           C761             NA             NA               0
9  1009           H653           G300             NA               1
10 1010           A049           G308             NA               0
11 1011           J679           A045           D352               0

非常感谢任何建议!

【问题讨论】:

【参考方案1】:

您可以使用apply,如下所示:

df$Disease_present <- apply(df[, -1], 1, function(x) 
  if(any(x %in% c("G20", "G300"))) 
    return(1)
   else 
    return(0)
  
)
df
     ID Disease_code_1 Disease_code_2 Disease_code_3 Disease_present
1  1001           I802           A071           H250               0
2  1002           H356             NA             NA               0
3  1003           G560            G20             NA               1
4  1004           D235             NA           I802               0
5  1005           B178             NA             NA               0
6  1006           F011           A049           A481               0
7  1007           F023             NA             NA               0
8  1008           C761             NA             NA               0
9  1009           H653           G300             NA               1
10 1010           A049           G308             NA               0
11 1011           J679           A045           D352               0

【讨论】:

桑尼,再次感谢您的及时和非常有帮助的回复!

以上是关于根据 R 中的一系列分类变量重新编码数值变量的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型分类预测器(分类变量)被自动替换为一组虚拟编码变量summary函数查看检查模型使用table函数计算混淆矩阵评估分类模型性能

R语言使用回归模型解决单因素方差分析问题(ANOVA as regression)方差分析和回归都是同广义线性模型的特例因子转化为数值的过程中(分类变量编码为连续变量自定义设置contrast)

[R] 中的 One-Hot 编码 |分类到虚拟变量

标称变量(Categorical Features)或者分类变量(Categorical Features​​​​​​​)编码为数值变量(Continuous Features​​​​​​​)

有序标称变量(Categorical Features)编码为数值变量(Continuous Features​​​​​​​)详解及实践

如何根据数值变量创建分类变量