同时向R中的data.table添加两列

Col*_*vel 1 r data.table

我有这个data.table:

DT <- data.table(num=c(1,4,6,7,8,12,13, 15), let=rep(c("A","B"), each=4))
Run Code Online (Sandbox Code Playgroud)

显示如下:

   num let
1:   1   A
2:   4   A
3:   6   A
4:   7   A
5:   8   B
6:  12   B
7:  13   B
8:  15   B
Run Code Online (Sandbox Code Playgroud)

我定义了这个功能:

f<-function(x){return(c(x+1,x+2))}
Run Code Online (Sandbox Code Playgroud)

我想得到这个:

   let V1 V2
1:   A  2  3
2:   A  5  6
3:   A  7  8
4:   A  8  9
5:   B  9 10
6:   B 13 14
7:   B 14 15
8:   B 16 17
Run Code Online (Sandbox Code Playgroud)

我运行这段代码:

DT[,list(f(num)),by=let]
Run Code Online (Sandbox Code Playgroud)

DT[,f(num),by=let]
Run Code Online (Sandbox Code Playgroud)

但我明白了:

    let V1
 1:   A  2
 2:   A  5
 3:   A  7
 4:   A  8
 5:   A  3
 6:   A  6
 7:   A  8
 8:   A  9
 9:   B  9
10:   B 13
11:   B 14
12:   B 16
13:   B 10
14:   B 14
15:   B 15
16:   B 17
Run Code Online (Sandbox Code Playgroud)

我想补充一点,我根本不想修改这个功能f.

Rol*_*and 8

DT[, as.data.table(matrix(f(num), ncol=2)), by=let]
#   let V1 V2
#1:   A  2  3
#2:   A  5  6
#3:   A  7  8
#4:   A  8  9
#5:   B  9 10
#6:   B 13 14
#7:   B 14 15
#8:   B 16 17
Run Code Online (Sandbox Code Playgroud)

当然,简单地改变功能将是更好和更有效的,因为它的设计是问题而不是data.table.无论是否在data.table中使用,您的函数都将始终返回原子向量.

f <- function(x) list(x+1, x+2)
DT[, f(num), by=let]
Run Code Online (Sandbox Code Playgroud)

  • `f < - function(x)list(a = x + 1,b = x + 2)`或者如果你不想修改函数`DT [,setNames(f(num),c("a","b) ")),by = let]`. (2认同)