Error using rbind to combine data.tables and one of them is empty

An error occurred while combining three (or more) data.tables with rbind and there is an empty data table between two non-empty data.tables:

> require(data.table)
Loading required package: data.table
data.table 1.9.2  For help type: help("data.table")

> DT <- data.table(x=c(1,2,3))
> rbind(DT, data.table(), DT)
Error in setcolorder(tt, chmatch(match.names, make.names(original.names[[x]],  (from <text>#1) : 
  Column numbers in neworder out of bounds: NA

This does not happen if an empty data table is at the end:

> rbind(DT, DT, data.table()) 
   x
1: 1
2: 2
3: 3
4: 1
5: 2
6: 3

But some other error occurs when an empty data table is at the beginning:

> rbind(data.table(), DT, DT) 
Error in data.table::.rbind.data.table(...) (from <text>#1) : 
  Some colnames of argument 2 (x) are not present in colnames of item 1. If an argument has colnames they can be in a different order, but they must all be present. Alternatively, you can supply unnamed lists and they will then be joined by position. Or, set use.names=FALSE.

However, if we use only two arguments, everything is fine:

> rbind(data.table(), DT) 
   x
1: 1
2: 2
3: 3

What should be the expected behavior?

+4
source share
2 answers

This is apparently due to inconsistent behavior in data.table::.rbind.data.table. Adding the following line will fix this. Please write a bug report with the help of developers data.table.

....
original.names = lapply(list(...), names)
allargs = lapply(list(...), as.data.table)
original.names = original.names[sapply(allargs, length) > 0L]  # this is the new line
allargs = allargs[sapply(allargs, length) > 0L]
...
+4

№ 5612 commit # 1266 (v1.9.3). NEWS:

o # 5249 # 5612, , rbind data.tables, : rbind data.tables . SO.

:

> rbind(data.table(), DT, DT) 

:

#    x
# 1: 1
# 2: 2
# 3: 3
# 4: 1
# 5: 2
# 6: 3
+1

Source: https://habr.com/ru/post/1537480/


All Articles