Как создать пустой тип данных с именами столбцов, а затем добавить в него данные?
Сначала я хочу создать пустую таблицу данных с именами столбцов, но это не удается:
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]
Это делает следующее
-
data.table(1)
: Создать non- NULL
data.table, в который вы можете добавить столбцы - Имеет один столбец
V1
с одной строкой. Значение 1
- Вы можете использовать любое значение (кроме
NULL
) вместо 1
-
[,':='(c("va", "vb", "vc"),NA)]
: добавить столбцы va
, vb
, vc
- Теперь имеет четыре столбца (начиная с
V1
) и одну строку. значение 1,NA,NA,NA
- Любое значение non-
NULL
может быть заменено на NA
-
[,V1:=NULL]
: удалить столбец V1
-
[.0]
: вернуть пустую строку - Вы можете использовать [.n], где n - любое целое число.
Если вам не нравится черная магия [.0]
вы также можете использовать
data <- data.table(1)[,':='(c("va", "vb", "vc"),NA)][,V1:=NULL][!is.na(va)]