2014-03-13 29 views
4

这是这个Question的direkt扩展。 我有一个数据集,我想找到这取决于变量X和Y变量v的所有配对组合:在R中使用data.table将多个列添加到data.table中,只用一个函数调用

library(data.table) 
DT = data.table(x=rep(c("a","b","c"),each=6), y=c(1,1,6), v=1:18) 
     x y v 
    1: a 1 1 
    2: a 1 2 
    3: a 6 3 
    4: a 1 4 
    5: a 1 5 
    6: a 6 6 
    7: b 1 7 
    8: b 1 8 
    9: b 6 9 
    10: b 1 10 
    11: b 1 11 
    12: b 6 12 
    13: c 1 13 
    14: c 1 14 
    15: c 6 15 
    16: c 1 16 
    17: c 1 17 
    18: c 6 18 

DT[, list(new1 = t(combn(sort(v), m = 2))[,1], 
    new2 = t(combn(sort(v), m = 2))[,2]), 
    by = list(x, y)] 
     x y new1 new2 
    1: a 1 1 2 
    2: a 1 1 4 
    3: a 1 1 5 
    4: a 1 2 4 
    5: a 1 2 5 
    6: a 1 4 5 
    7: a 6 3 6 
    8: b 1 7 8 
    9: b 1 7 10 
    10: b 1 7 11 
    11: b 1 8 10 
    12: b 1 8 11 
    13: b 1 10 11 
    14: b 6 9 12 
    15: c 1 13 14 
    16: c 1 13 16 
    17: c 1 13 17 
    18: c 1 14 16 
    19: c 1 14 17 
    20: c 1 16 17 
    21: c 6 15 18 

的代码我想要做什么,但两次函数调用使得它慢了更大的数据集。我的数据集有超过300万行和超过130万个x和y的组合。 有关如何更快地完成此任务的任何建议? 我宁愿是这样的:

DT[, list(c("new1", "new2") = t(combn(sort(v), m = 2))), by = list(x, y)] 
+0

我看到两件事情可能会加快这一进程 1.转换数据框到矩阵后重命名列。 2.预先分配内存到'new2'之前的过程 我认为总的来说,你会发现这非常有用 http://stackoverflow.com/questions/2908822/speed-up-the-loop-operation-in- r –

+3

@pops,不同之处在于它是一个'data.table',它不同于'data.frame'(但是它继承了那个类)。 –

+0

您示例数据中的“v”列与您发布的代码不符。哪个是对的? –

回答

5

这应该工作:

DT[, { 
    tmp <- combn(sort(v), m = 2) 
    list(new1 = tmp[1,], new2 = tmp[2,]) 
    } 
, by = list(x, y) ] 
+0

这个解决方案不如@shadow的建议好,但它比我的特定数据集快16倍以上... –

4

下也适用。诀窍是将matrix转换为data.table

DT[, data.table(t(combn(sort(v), m = 2))), by=list(x, y)] 

如果有必要,只是

r2 <- DT[, data.table(t(combn(sort(v), m = 2))), by=list(x, y)] 
setnames(r2, c("V1", "V2"), c("new1", "new2")) 
+0

完美 - 非常感谢 –

+0

如果v是一个字符变量你需要一个附加data.frame(),因为data.table将字符转换为一个因子:'r2 < - DT [,data.table(data.frame(t(combn(sort(v),m = 2)) ,stringsAsFactors = F)),by = list(x,y)]' –

相关问题