R data.table 一次性创建多列
R data.table create multiple columns in one go
这个问题是关于一个特定的 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)
"not working properly"?
我见过人们做这样的事情:
dataDT[, c("A", "B", "c") := list(sum(ID), mean(ID), func(ID))]
使用 list()
到 "cbind" 新值。
我应该如何修复我的代码?
自从
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
如果我们需要复制,一个选项是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
或使用赋值(:=
)
dataDT[, paste0('ID', 1:3) := ID][]
这个问题是关于一个特定的 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)
"not working properly"?
我见过人们做这样的事情:
dataDT[, c("A", "B", "c") := list(sum(ID), mean(ID), func(ID))]
使用 list()
到 "cbind" 新值。
我应该如何修复我的代码?
自从
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
如果我们需要复制,一个选项是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
或使用赋值(:=
)
dataDT[, paste0('ID', 1:3) := ID][]