Используйте data.table в R, чтобы добавить несколько столбцов в data.table с помощью = только с одним вызовом функции


person fc9.30    schedule 13.03.2014    source источник
comment
Я вижу две вещи, которые могли бы ускорить этот процесс: 1. Преобразование кадра данных в матрицу. 2. Предварительно выделить память для «new2» перед процессом. Я думаю, в целом вы найдете это очень полезным r" title="ускорить работу цикла в r">stackoverflow.com/questions/2908822/   -  person Pork Chop    schedule 13.03.2014
comment
@pops, за исключением того, что это data.table, который не совпадает с data.frame (но он наследуется от этого класса).   -  person Simon O'Hanlon    schedule 13.03.2014
comment
Ваш столбец v в данных примера не соответствует опубликованному вами коду. Что правильно?   -  person Simon O'Hanlon    schedule 13.03.2014
comment
Сколько уникальных значений содержится в x и в y по отдельности? Вместе они составляют около 1,3 м, как вы уже сказали.   -  person Arun    schedule 13.03.2014
comment
1 млн. уникальные значения x и 400T уникальных значений y   -  person fc9.30    schedule 13.03.2014


Ответы (2)


Это должно работать:

DT[, {
    tmp <- combn(sort(v), m = 2 )
    list(new1 = tmp[1,], new2 = tmp[2,] )
  }
, by = list(x, y) ]
person Beasterfield    schedule 13.03.2014
comment
Это решение не так хорошо, как предложение @shadow, но оно более чем в 16 раз быстрее (для моего конкретного набора данных)... - person fc9.30; 14.03.2014

Следующее также работает. Хитрость заключается в том, чтобы преобразовать 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"))
person shadow    schedule 13.03.2014
comment
ЕСЛИ v является символьной переменной, вам нужен дополнительный data.frame(), потому что data.table преобразует символ в фактор: r2 <- DT[, data.table(data.frame(t(combn(sort(v), m = 2)), stringsAsFactors = F)), by=list(x, y)] - person fc9.30; 13.03.2014