这是我对data.table不了解的内容
如果我选择一行,并且尝试将该行的所有值设置为NA,则新的l​​ine-data.table被强制为逻辑

#Here is a sample table
DT <- data.table(a=rep(1L,3),b=rep(1.1,3),d=rep('aa',3))
DT
#    a   b  d
# 1: 1 1.1 aa
# 2: 1 1.1 aa
# 3: 1 1.1 aa

#Here I extract a line, all the column types are kept... good
str(DT[1])
# Classes ‘data.table’ and 'data.frame':  1 obs. of  3 variables:
#  $ a: int 1
#  $ b: num 1.1
#  $ d: chr "aa"
#  - attr(*, ".internal.selfref")=<externalptr>

#Now here I want to set them all to `NA`...they all become logicals => WHY IS THAT ?
str(DT[1][,colnames(DT) := NA])
# Classes ‘data.table’ and 'data.frame':  1 obs. of  3 variables:
#  $ a: logi NA
#  $ b: logi NA
#  $ d: logi NA
#  - attr(*, ".internal.selfref")=<externalptr>
编辑:我认为这是一个错误
str(DT[1][ , a := NA])
# Classes ‘data.table’ and 'data.frame':  1 obs. of  3 variables:
#  $ a: logi NA
#  $ b: num 1.1
#  $ d: chr "aa"
#  - attr(*, ".internal.selfref")=<externalptr>

str(DT[1:2][ , a := NA])
# Classes ‘data.table’ and 'data.frame':  2 obs. of  3 variables:
#  $ a: int  NA NA
#  $ b: num  1.1 1.1
#  $ d: chr  "aa" "aa"
#  - attr(*, ".internal.selfref")=<externalptr>

最佳答案

要提供答案,请通过?":=":



当然,所有这些的动机是大表(例如RAM中有10GB)。不是1或2行表。

简而言之:如果为length(RHS) == nrow(DT),则将RHS(及其任何类型)插入该列插槽。即使这些长度为1。如果是length(RHS) < nrow(DT),则该列(及其类型)的内存也会保留在原位,但是RHS被强制并回收以替换该列中的(子集)项。

如果需要在大表中更改列的类型,请编写:

DT[, col := as.numeric(col)]

这里as.numeric分配一个新的向量,将“col”强制到该新内存中,然后将其插入列插槽。它尽可能高效。之类的原因是因为length(RHS) == nrow(DT)

如果要覆盖包含其他默认值的其他类型的列,请执行以下操作:
DT[, col := rep(21.5, nrow(DT))]    # i.e., deliberately harder

如果“col”之前是整数类型,则它将更改为数字类型,每行包含21.5。否则,仅DT[, col := 21.5]会导致有关将21.5强制转换为21的警告(除非DT仅1行!)

关于r - 当我按引用分配所有列时,为什么data.table转换列类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18594017/

10-12 17:33