Как создать пустой тип данных с именами столбцов, а затем добавить в него данные?

Сначала я хочу создать пустую таблицу данных с именами столбцов, но это не удается:

data <- data.table(va, vb, vc)

> Error in data.table(va, vb, vc) : object 'va' not found

Во-вторых, я хочу добавить данные к нему, но это тоже не получается:

data2 <- data.table(va=c(-1,0,1), vb=c(-1,0,1), vc=c(-1,0,1))
data2
   va vb vc
1: -1 -1 -1
2:  0  0  0
3:  1  1  1
merge(data2,data2)

> Error in merge.data.table(data2, data2) : 
      Can not match keys in x and y to automatically determine appropriate 'by' parameter. Please set 'by' value explicitly.

Очевидно, что функция не может идентифицировать параметры by с двумя одинаковыми таблицами данных. Любая идея?

Ответ 1

Чтобы создать пустой data.table используйте (при условии, что все столбцы являются числовыми):

library(data.table)    
data <- data.table(va=numeric(), vb=numeric(), vc=numeric())
data

что приводит к:

> data
Empty data.table (0 rows) of 3 cols: va,vb,vc

Для самостоятельного объединения всех столбцов используйте (даже если результат одинаковый ;-):

data2 <- data.table(va=c(-1,0,1), vb=c(-1,0,1), vc=c(-1,0,1))
data2
merge(data2, data2,by=names(data2))

Причиной, по которой вы должны указать параметр by является документированная семантика merge:

от:

Вектор общих имен столбцов в x и y для объединения. По умолчанию это столбцы общего ключа между двумя таблицами. Если у y нет ключевых столбцов, по умолчанию используется ключ x.

Поскольку у вас нет никаких ключей, столбцы "соединения" для объединения таблиц данных неясны.

Не существует неявной семантики "использовать все столбцы", если вы опустите параметр by (как указано выше, используются столбцы общего ключа).

Чтобы добавить все строки таблицы data.table в другую, вместо merge вы используете rbind ("связывание строк"):

data3 <- rbind(data2, data2)
data3

Что приводит к:

> data3
   va vb vc
1: -1 -1 -1
2:  0  0  0
3:  1  1  1
4: -1 -1 -1
5:  0  0  0
6:  1  1  1

Ответ 2

Чтобы создать пустую таблицу данных, вы можете начать с пустой матрицы:

library(data.table)
data <- setNames(data.table(matrix(nrow = 0, ncol = 3)), c("va", "vb", "vc"))
data
Empty data.table (0 rows) of 3 cols: va,vb,vc

Затем вы можете использовать rbindlist для добавления к нему новых data.table:

data2=data.table(va=c(-1,0,1), vb=c(-1,0,1), vc=c(-1,0,1))
data2
   va vb vc
1: -1 -1 -1
2:  0  0  0
3:  1  1  1
rbindlist(list(data, data2))
   va vb vc
1: -1 -1 -1
2:  0  0  0
3:  1  1  1

Или даже проще, работает следующее:

data <- data.table()
data <- rbindlist(list(data, data2))
data
   va vb vc
1: -1 -1 -1
2:  0  0  0
3:  1  1  1

Ответ 3

Другой способ создать пустой data.table с определенными именами столбцов, но без определения типов данных:

data <- data.table(1)[,':='(c("va", "vb", "vc"),NA)][,V1:=NULL][.0]

Это делает следующее

  1. data.table(1): Создать non- NULL data.table, в который вы можете добавить столбцы
    • Имеет один столбец V1 с одной строкой. Значение 1
    • Вы можете использовать любое значение (кроме NULL) вместо 1
  2. [,':='(c("va", "vb", "vc"),NA)]: добавить столбцы va, vb, vc
    • Теперь имеет четыре столбца (начиная с V1) и одну строку. значение 1,NA,NA,NA
    • Любое значение non- NULL может быть заменено на NA
  3. [,V1:=NULL]: удалить столбец V1
  4. [.0]: вернуть пустую строку
    • Вы можете использовать [.n], где n - любое целое число.

Если вам не нравится черная магия [.0] вы также можете использовать

data <- data.table(1)[,':='(c("va", "vb", "vc"),NA)][,V1:=NULL][!is.na(va)]