这是我对data.table
不了解的内容
如果我选择一行,并且尝试将该行的所有值设置为NA
,则新的line-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/