村长,数据科学、指弹吉他及录音工程爱好者,浙大金融学博士在读,在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的变量。
领取专属 10元无门槛券
私享最新 技术干货