关于data.table中i,j,by都为数字的理解

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

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

在前面

题:i, j, by同时输入数字会怎样?

以mtcars这个R自带的数据集为例,我们知道mtcars[1]的运行结果,是选择这个数据集的第一行,结果如下:

mtcars[1,1]的运行结果,是选择第一行第一列的元素,结果如下:

那么mtcars[1, 1, 1]是什么运行结果呢,可能很多小伙伴都没想过,到底能不能运行出来可能都觉得要打个问号。话不多说,马上运行,结果如下:

看到这个结果大家是不是还有点一头雾水,下面就让笔者来对这个结果进行分析讲解。

题解析

为了弄清楚这个问题,我们根据i, j, by运行的顺序:“先i,再by,最后j”,将i, j, by拆解进行分析

首先,我们单独看i只有一个1的情况下是什么运行结果,为了让运行出来的代码被认定是data.table的格式,我们在j中加入.SD(不清楚.SD用途的小伙伴可以查看data.table的manual,或者查看笔者上一篇推送用data.table语句批量处理变量),代码如下:

mtcars[1, .SD]

运行结果如下:

可见,在DT的i中输入一个数字和用一般的提取符号`[`只输入一个数字的结果完全一样,就是提取这个数据集中的某一行。

接下来,我们在by的位置加上一个1,代码如下:

mtcars[1, .SD, 1]

再来看看运行结果:

这时多了一列变量,变量名缺失,且只有一行观测值为数字“1”。

最后,我们将j中的1添加进去,代码与结果如下:

mtcars[1, 1, 1]

果分析

从这样一段拆解当中,我们大致就可以明白为什么会出现这样的结果了,整体的运行思路就是:首先选出了第一行,而后在by中以一个变量名默认为NA的变量为基准,最后在j中生成了一个默认变量名为V1的变量。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181214B0JH7200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券