我有data.table
:
DT <- data.table(num=c(1,4,6,7,8,12,13, 15), let=rep(c("A","B"), each=4))
显示如下:
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
我定义了这个功能:
f<-function(x){return(c(x+1,x+2))}
我想得到这个:
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
我运行此代码:
DT[,list(f(num)),by=let]
和
DT[,f(num),by=let]
但我明白了:
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
我想补充一点,我根本不想修改函数f
。
答案 0 :(得分: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
当然,简单地更改功能会更好,更有效,因为它的设计是问题,而不是data.table。无论是否在data.table中使用,您的函数都将始终返回原子向量。
f <- function(x) list(x+1, x+2)
DT[, f(num), by=let]