写在前面
本期我们大猫二人组的村长在新的一年首先回归,为大家带来新的推送。
在本期,我们会运用一个病例数据为大家进行讲解示范,这也是大猫课堂第一次针对阅读者提问进行的反馈,也希望大家能提供一些有趣的问题,来和我们一起分享,同时也感谢读者孤鹜惜秋,与我们分享其问题。话不多说,马上进入正题。
问题提出
在data.table语句中,i是用来进行行选择的重要组成部分,很多情况下我们都需要以很多列的同一个特殊值进行行的选择,大多数情况下,我们可能会针对所有的变量逐一写出条件,例如a==1&b==1&c==1.... 但这样的表达式很多时候并不方便和简洁,有时甚至会出现许多问题。首先来看看下面这个数据:
这是一个病例数据,包含多个患者的诊断的时间,以及多个诊断的结果,在这里读者便提出,需要在所有这些诊断结果里面筛选出所有出现过醛固酮,但不包括继发性醛固酮的所有行。在这里如果对每一个条件进行输入,需要输入20多个变量的判定,而且这里的变量名非常的脏,不利于变量名的输入。我们先把这一行代码优雅的放上来(PS: 在运行这一行代码前我们已经对数据进行了适当清洗,批量生成了22个带'_xtrct'后缀的变量,观察值是醛固酮、继发性醛固酮或者无,但这部分批量生成的代码不作为这次讲解的内容, 会在以后的公众号推送中为大家讲解):
clinic <- clinic[rowMeans(clinic[, 31:52] == "醛固酮") > 0 & rowMeans(clinic[, 31:52] != "继发性醛固酮") == 1]
我们再来看看结果:
结果非常出色,不过大家看到这一段语句是不是有点懵,不用着急,待小编慢慢讲解。
代码解读
里层代码
我们先从最里面的一层代码开始, 首先来看下面一段代码的运行结果:
clinic[, 31:52] == "醛固酮"
从运行结果可以看出这是一个logic结果判定矩阵,里面主要判定这个矩阵里面是否是醛固酮, 如果是返回TRUE,如果不是返回FALSE,同理于代码:
clinic[, 31:52] != "继发性醛固酮"
判定是否观察值里面是否是继发性醛固酮,如果不是返回TRUE,如果是返回FALSE。
外层代码
下面来看外层代码:
rowMeans(clinic[, 31:52] == "醛固酮") > 0
这里运用了R语言中非常关键的一个知识点:对逻辑判断值进行四则运算时,TRUE会被当做1,FALSE会被当做0, 这一点在这里非常重要!!!! 那么在这里求每一行的均值,只要出现了醛固酮,那就会至少出现一个TRUE,那么行的均值就肯定大于零,所以就将出现了醛固酮的行全都标记出来了,同理可得下面这行代码:
rowMeans(clinic[, 31:52] != "继发性醛固酮") == 1
标记出了所有没有出现继发性醛固酮的行。
这样我们把这两个条件合并在一起,然后配套上data.table的语句,就成了我们一开始出现的那条代码:
clinic <- clinic[rowMeans(clinic[, 31:52] == "醛固酮") > 0 & rowMeans(clinic[, 31:52] != "继发性醛固酮") == 1]
写在结尾
应用好对象格式是R语言编程中的精髓之一,在这个例子中就很好的利用了对象格式里面的格式性质,做了一些适当的变通处理,让数据处理过程变得更加巧妙和方便,这点大家可以在以后的数据处理中做更多的尝试和思考!
下期预告
下一期我们将讲述在这一次数据处理中遇到的另外一个问题,问题的内容已经在前文中说明,大家如果自习阅读会发现这个新年彩蛋!!再次恭祝大家新年快乐,万事如意!!!
大猫的R语言课堂
我是大猫,一个高中读文科但却在代码、数学的路上狂奔不止的Finance Ph. D Candidate。
我是村长,一个玩了9年指弹吉他,却被代码深深吸引的博士候选人。
大猫的微信号是:
iRoss2007
村长的B站主页是:http://space.bilibili.com/40771572