如何用data.table直接提取列表列中的单个对象而非列表形式?
如何用data.table直接提取单个对象而非列表包裹
我明白你的痛点——每次取单个对象还要额外加[[1]]确实麻烦,其实用data.table本身的语法就能解决这个问题,下面给你几个简洁的方案:
方案1:直接在j中提取列表元素
这是最直接的写法,当你确定筛选后只会得到一个结果时,在j参数里直接对列做列表索引:
class(dt[i == 1 & j == 1, a[[1]]])
这样返回的就是纯粹的histogram对象,和class(a1)的结果完全一致。原理是:a列的每个元素本身就是单个hist对象,a[[1]]会直接取出当前行里的这个对象,而不是返回包含它的列表子集。
方案2:通用型写法(适配单/多结果场景)
如果你的场景可能有时候返回多个结果,有时候只返回一个,想让代码自动适配,可以结合.N(当前筛选后的行数)做判断:
dt[i == 1 & j == 1, if (.N == 1) a[[1]] else a]
当筛选结果只有1行时,返回单个对象;多行时返回列表,兼顾了两种场景的需求。
为什么原写法会返回列表?
简单解释下:当你在data.table的j中直接写列名a时,返回的是该列的子集——哪怕只有一个元素,它本质还是列表类型的列子集,所以会被列表包裹。而我们上面的写法是直接深入到列的每个元素内部,取出实际的对象。
内容的提问来源于stack exchange,提问作者Zhaochen He
相关产品推荐
相关产品推荐

