R语言:以多列标准筛选特定行

640?wx_fmt=png

作者:村长,数据科学、指弹吉他及录音工程爱好者,浙大金融学博士在读,在data.table包和MongoDB的使用上有较多经验。


在前面

本期我们大猫二人组的村长在新的一年首先回归,为大家带来新的推送。

在本期,我们会运用一个病例数据为大家进行讲解示范,这也是大猫课堂第一次针对阅读者提问进行的反馈,也希望大家能提供一些有趣的问题,来和我们一起分享,同时也感谢读者孤鹜惜秋,与我们分享其问题。话不多说,马上进入正题。


题提出

在data.table语句中,i是用来进行行选择的重要组成部分,很多情况下我们都需要以很多列的同一个特殊值进行行的选择,大多数情况下,我们可能会针对所有的变量逐一写出条件,例如a==1&b==1&c==1.... 但这样的表达式很多时候并不方便和简洁,有时甚至会出现许多问题。首先来看看下面这个数据:

扫描二维码关注公众号,回复: 5230231 查看本文章
640?wx_fmt=png


这是一个病例数据,包含多个患者的诊断的时间,以及多个诊断的结果,在这里读者便提出,需要在所有这些诊断结果里面筛选出所有出现过醛固酮,但不包括继发性醛固酮的所有行。在这里如果对每一个条件进行输入,需要输入20多个变量的判定,而且这里的变量名非常的脏,不利于变量名的输入。我们先把这一行代码优雅的放上来(PS: 在运行这一行代码前我们已经对数据进行了适当清洗,批量生成了22个带'_xtrct'后缀的变量,观察值是醛固酮、继发性醛固酮或者无,但这部分批量生成的代码不作为这次讲解的内容, 会在以后的公众号推送中为大家讲解):


clinic <- clinic[rowMeans(clinic[, 31:52] == "醛固酮") > 0 & rowMeans(clinic[, 31:52] != "继发性醛固酮") == 1]

我们再来看看结果:

640?wx_fmt=png


结果非常出色,不过大家看到这一段语句是不是有点懵,不用着急,待小编慢慢讲解。


码解读

里层代码

我们先从最里面的一层代码开始, 首先来看下面一段代码的运行结果:



clinic[, 31:52] == "醛固酮"

640?wx_fmt=png


从运行结果可以看出这是一个logic结果判定矩阵,里面主要判定这个矩阵里面是否是醛固酮, 如果是返回TRUE,如果不是返回FALSE,同理于代码:



clinic[, 31:52] != "继发性醛固酮"


判定是否观察值里面是否是继发性醛固酮,如果不是返回TRUE,如果是返回FALSE。


外层代码

下面来看外层代码:

rowMeans(clinic[, 31:52] == "醛固酮") > 0

这里运用了R语言中非常关键的一个知识点:对逻辑判断值进行四则运算时,TRUE会被当做1FALSE会被当做0, 这一点在这里非常重要!!!!
那么在这里求每一行的均值,只要出现了醛固酮,那就会至少出现一个TRUE,那么行的均值就肯定大于零,所以就将出现了醛固酮的行全都标记出来了,同理可得下面这行代码:

rowMeans(clinic[, 31:52] != "继发性醛固酮") == 1

标记出了所有没有出现继发性醛固酮的行。


这样我们把这两个条件合并在一起,然后配套上data.table的语句,就成了我们一开始出现的那条代码:

clinic <- clinic[rowMeans(clinic[, 31:52] == "醛固酮") > 0 & rowMeans(clinic[, 31:52] != "继发性醛固酮") == 1]


在结尾

应用好对象格式是R语言编程中的精髓之一,在这个例子中就很好的利用了对象格式里面的格式性质,做了一些适当的变通处理,让数据处理过程变得更加巧妙和方便,这点大家可以在以后的数据处理中做更多的尝试和思考!


期预告

下一期我们将讲述在这一次数据处理中遇到的另外一个问题,问题的内容已经在前文中说明。祝大家开工大吉!

转载自公众号:大猫的R语言课堂


640?wx_fmt=gif

往期精彩:


640?wx_fmt=jpeg

公众号后台回复关键字即可学习

回复 爬虫            爬虫三大案例实战
回复 Python       1小时破冰入门
回复 数据挖掘     R语言入门及数据挖掘
回复 人工智能     三个月入门人工智能
回复 数据分析师  数据分析师成长之路 
回复 机器学习     机器学习的商业应用
回复 数据科学     数据科学实战
回复 常用算法     常用数据挖掘算法


给我【好看】

你也越好看!

640?wx_fmt=png

猜你喜欢

转载自blog.csdn.net/kMD8d5R/article/details/87035179
今日推荐