R data.table создает несколько столбцов за один раз - PullRequest
1 голос
/ 28 июня 2019

Этот вопрос касается конкретной операции data.table.

У меня есть:

dataDT <- data.table(ID = c(1:3))
dataDT
> dataDT
   ID
1:  1
2:  2
3:  3

Я хочу создать три новых столбца для хранения данных из 3 разных источников.

targetDT <- data.table(ID = c(1:3), ID1 = c(1:3), ID2 = c(1:3), ID3 = c(1:3))
targetDT
> targetDT
   ID ID1 ID2 ID3
1:  1   1   1   1
2:  2   2   2   2
3:  3   3   3   3

Итак, я попробовал:

tempDT_1 <- data.table(ID1 = c(1:3))    # create dummy source 1
tempDT_2 <- data.table(ID2 = c(1:3))    # create dummy source 2
tempDT_3 <- data.table(ID3 = c(1:3))    # create dummy source 3

dataDT[, c("A", "B", "c") := list(tempDT_1, tempDT_2, tempDT_3)]
dataDT
> dataDT
   ID     A     B     c
1:  1 1,2,3 1,2,3 1,2,3
2:  2 1,2,3 1,2,3 1,2,3
3:  3 1,2,3 1,2,3 1,2,3

Почему вышеприведенный list(tempDT_1, tempDT_2, tempDT_3) "не работает должным образом"?

Я видел, как люди делают такие вещи:

dataDT[, c("A", "B", "c") := list(sum(ID), mean(ID), func(ID))]

, который использует list() для "привязки" новых значений.

Как мне исправить мои коды?

Ответы [ 2 ]

1 голос
/ 28 июня 2019

Если нам нужно сделать реплики, опция: replicate

setDT(data.frame(replicate(4, dataDT)))[]
#   ID ID.1 ID.2 ID.3
#1:  1    1    1    1
#2:  2    2    2    2
#3:  3    3    3    3

Или используйте assign (:=)

dataDT[, paste0('ID', 1:3) := ID][]
1 голос
/ 28 июня 2019

С

class(tempDT_1 )
[1] "data.table" "data.frame" 

В вашем случае, чтобы соответствовать выводу, мы должны использовать cbind

cbind(dataDT, tempDT_1, tempDT_2, tempDT_3)
   ID ID1 ID2 ID3
1:  1   1   1   1
2:  2   2   2   2
3:  3   3   3   3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...