Rbind有新列和data.table

Chr*_*ris 12 r data.table

我需要在现有表中添加许多大表,所以我使用rbind和优秀的包data.table.但是后面的一些表有比原始列更多的列(需要包含它们).是否有相当于data.table的rbind.fill?

library(data.table)

aa <- c(1,2,3)
bb <- c(2,3,4)
cc <- c(3,4,5)

dt.1 <- data.table(cbind(aa, bb))
dt.2 <- data.table(cbind(aa, bb, cc))

dt.11 <- rbind(dt.1, dt.1)  # Works, but not what I need
dt.12 <- rbind(dt.1, dt.2)  # What I need, doesn't work
dt.12 <- rbind.fill(dt.1, dt.2)  # What I need, doesn't work either
Run Code Online (Sandbox Code Playgroud)

我需要在拥有所有表之前开始rbinding,因此无法知道将来会调用哪些新列.缺少的数据可以用NA填充.

Dan*_*ian 11

因为v1.9.2,data.table'rbind函数得到了fill论证.来自?rbind.data.table文档:

如果TRUE使用NA填充缺少的列.默认为FALSE.如果为TRUE,则use.names必须为TRUE,并且输入列表的所有项都必须具有非空列名.

因此你可以做到(大约在v1.9.6之前):

data.table::rbind(dt.1, dt.2, fill=TRUE) 
#    aa bb cc
# 1:  1  2 NA
# 2:  2  3 NA
# 3:  3  4 NA
# 4:  1  2  3
# 5:  2  3  4
# 6:  3  4  5
Run Code Online (Sandbox Code Playgroud)

v1.9.6的更新:

现在可以直接使用:

rbind(dt.1, dt.2, fill=TRUE)
#    aa bb cc
# 1:  1  2 NA
# 2:  2  3 NA
# 3:  3  4 NA
# 4:  1  2  3
# 5:  2  3  4
# 6:  3  4  5
Run Code Online (Sandbox Code Playgroud)

  • `错误:'rbind' 不是从 'namespace:data.table'` 导出的对象吗? (2认同)

mne*_*nel 5

这是一种更新缺失列的方法

rbind.missing <- function(A, B) { 

  cols.A <- names(A)
  cols.B <- names(B)

  missing.A <- setdiff(cols.B,cols.A)
  # check and define missing columns in A
  if(length(missing.A) > 0L){
   # .. means "look up one level"
   class.missing.A <- lapply(B[, ..missing.A], class)
   nas.A <- lapply(class.missing.A, as, object = NA)
   A[,c(missing.A) := nas.A]
  }
  # check and define missing columns in B
  missing.B <- setdiff(names(A), cols.B)
  if(length(missing.B) > 0L){
    class.missing.B <- lapply(A[, ..missing.B], class)
    nas.B <- lapply(class.missing.B, as, object = NA)
    B[,c(missing.B) := nas.B]
  }
  # reorder so they are the same
  setcolorder(B, names(A))
  rbind(A, B)

}

rbind.missing(dt.1,dt.2)

##    aa bb cc
## 1:  1  2 NA
## 2:  2  3 NA
## 3:  3  4 NA
## 4:  1  2  3
## 5:  2  3  4
## 6:  3  4  5
Run Code Online (Sandbox Code Playgroud)

这对于许多或大型data.tables来说效率不高,因为它一次只能工作两个.