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.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来说效率不高,因为它一次只能工作两个.