3
library(data.table)

DT = data.table(iris)

虹膜数据作为 data.table

str(DT)
> Classes ‘data.table’ and 'data.frame':  150 obs. of  5 variables:
>  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... 
>  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
>  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... 
>  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... 
>  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1
>  - attr(*, ".internal.selfref")=<externalptr>

这只是一个简单的函数,通过删除因子列来添加 iris 的数字部分。

myfun = function(dt){
    dt[,Species:=NULL]
    return(sum(dt))
}

运行函数

myfun(DT)  
> [1] 2078.7

现在 DT 缺少全局环境中的 Species 列

str(DT)
> Classes ‘data.table’ and 'data.frame':  150 obs. of  4 variables:
>  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
>  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
>  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
>  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
>  - attr(*, ".internal.selfref")=<externalptr>
4

2 回答 2

3

data.table通过参考工作。这就是它如此快速和有用的原因。

但这也意味着在函数中传递参数时必须小心。如果您不传递副本,您将更改原始对象。

myfun = function(dt){
    # Use something like this
    dt <- copy(dt)    <~~~~~ KEY LINE
    dt[,Species:=NULL]
    return(sum(dt))
}

或者,您可以在调用copy函数时调用:

 myfun(copy(DT))

但我认为这给错误留下了太多的空间。

于 2013-10-08T19:18:05.090 回答
0

它是重复的,通过搜索找到:[r] select columns data.table

这些工作中的任何一个:

> sum(DT[,!"Species"])
[1] 2078.7
> sum(DT[,1:4])
[1] 2078.7
> sum(DT[,-5])
[1] 2078.7

“物种”仍在 DT 中。

于 2013-10-08T19:03:54.577 回答