【问题标题】:Subset data table without using <-不使用 <- 的子集数据表
【发布时间】:2015-12-29 05:22:05
【问题描述】:

我想对数据表的某些行进行子集化。像这样:

# load data
  data("mtcars")

# convert to data table
  setDT(mtcars,keep.rownames = T)

# Subset data
  mtcars <- mtcars[like(rn,"Mer"),] # or
  mtcars <- mtcars[mpg > 20,]

但是,我正在处理一个庞大的数据集,我想避免使用 &lt;-,因为它会复制数据,因此内存效率不高。

这是正确的吗? 没有&lt;-是否可以更新过滤数据?

【问题讨论】:

  • 如何在不将数据分配给变量的情况下更新数据?最后,在您处理完所有更改后,必须将更改分配给一个变量。
  • 如果您不想存储数据,为什么要对数据进行子集化?你只是暂时需要它吗?还是您只需要子集并想要删除原始文件,并且您正在寻找一种有效的方法来做到这一点?
  • 我认为您要求的是不可能的。不过,这可能是 GH 上的一个有趣的 FR。但我相信要实现这样的事情需要大量的开发。
  • @DavidArenburg 只是通过引用删除实际上并不难。好处主要是内存效率而不是速度。

标签: r data.table subset


【解决方案1】:

您要问的是按引用删除行

目前还不可能,但是#635 有 FR。

在此之前,您需要复制(在内存中)您的 data.table 子集,当与子集 (i arg) 结合时,复制由 &lt;-(或 =)完成,所以现在您不能避免这种情况。

如果它可以帮助您以某种方式对语言对象进行操作以预定义操作并延迟其评估,也可以多次重用预定义对象:

mtcars_sub <- quote(mtcars[like(rn,"Mer")])
mtcars_sub2 <- quote(eval(mtcars_sub)[mpg > 20])
eval(mtcars_sub2)
#           rn  mpg cyl  disp hp drat   wt qsec vs am gear carb
# 1: Merc 240D 24.4   4 146.7 62 3.69 3.19 20.0  1  0    4    2
# 2:  Merc 230 22.8   4 140.8 95 3.92 3.15 22.9  1  0    4    2

顺便说一句。当对 data.table 进行子集化时,您不需要使用中间逗号,例如 dt[x==1,],您可以使用 dt[x==1]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 2021-10-31
    • 2013-11-07
    • 2020-01-02
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 2012-10-22
    相关资源
    最近更新 更多