【问题标题】:R Best way to delete data.table rows in a function callR在函数调用中删除data.table行的最佳方法
【发布时间】:2021-03-17 10:07:49
【问题描述】:

我正在寻找在函数调用中对iris 数据集进行子集化的最佳方法。这是代码-

data(iris)

remove_rows <- function(x)
{
  x = setDT(x)[Species == "virginica"]
}
remove_rows(iris)
> iris
     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
  1:          5.1         3.5          1.4         0.2    setosa
  2:          4.9         3.0          1.4         0.2    setosa
  3:          4.7         3.2          1.3         0.2    setosa
  4:          4.6         3.1          1.5         0.2    setosa
  5:          5.0         3.6          1.4         0.2    setosa
 ---                                                            
146:          6.7         3.0          5.2         2.3 virginica
147:          6.3         2.5          5.0         1.9 virginica
148:          6.5         3.0          5.2         2.0 virginica
149:          6.2         3.4          5.4         2.3 virginica
150:          5.9         3.0          5.1         1.8 virginica

如您所见,运行remove_rows 函数后没有任何行被删除。这是可以理解的,因为库 data.table 没有通过引用删除行的功能。 我使用的解决方法是更新remove_rows 函数并从函数中返回新对象-

library(data.table)
remove_rows <- function(x)
{
  x= setDT(x)[Species == "virginica"]
  return(x)
}
iris = remove_rows(iris)

这已经解决了问题,但是由于在我的例子中这个 data.table 很大(iris 只是一个玩具示例),运行这个函数并复制 iris 数据集中的子集需要很长时间。

这种情况有解决办法吗?

【问题讨论】:

标签: r data.table


【解决方案1】:

此功能尚未实现。强烈要求。你可以在https://github.com/Rdatatable/data.table/issues/635跟踪它的进度

您要测试的函数setsubset 不完整。它缺少将对象的真实长度设置为比原始长度更短的 C 部分,因此如果不实际添加缺失的部分,它对您没有多大帮助。与现在一样,它将在 data.table 的开头返回一个子集,其余行将是垃圾。

现在,您必须从函数返回新对象,并将其分配给(可能)与您传递给函数的变量相同的变量。如果您真的不想这样做,您可以随时使用assign 作为父框架,但它不太优雅。

【讨论】:

    猜你喜欢
    • 2016-04-06
    • 2019-02-15
    • 2012-01-07
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2016-01-31
    相关资源
    最近更新 更多