#r #data.table #set
Вопрос:
Из foo.in data.table, и благодаря помощи, которую я смог получить здесь, мне удается получить то, что я хотел : foo.out.
set.seed(123)
foo.in <- data.table(id = rep(LETTERS[1:10], each = 10),
code = sample(c(111, 222, 333, 444), 100, replace = TRUE),
cof = rep(runif(10, 1, 10), each = 10),
x1 = sample(0:1, 100, replace = TRUE),
x2 = sample(0:1, 100, replace = TRUE),
x3 = sample(0:1, 100, replace = TRUE),
x4 = sample(0:1, 100, replace = TRUE),
x5 = sample(0:1, 100, replace = TRUE),
x6 = sample(0:1, 100, replace = TRUE))
foo.out <- foo.in[, lapply(.SD, function(x) uniqueN(code[x==1]) * cof),
.SDcols = grep("^x\d $", names(foo.in)),
by = .(id, cof)]
Это работает нормально, но с очень большой таблицей data.table я хотел бы протестировать другой синтаксис с for
помощью and set
.
Документируя себя, я понял, что в зависимости от случая это может быть быстрее, чем использование .SD
. Даже если окажется, что это не так, это хорошее упражнение для изучения и выполнения моих собственных тестов.
Но я не могу сделать это с помощью этого синтаксиса…
Моя попытка :
cols <- paste0("x", c(1:6))
for (c in cols) { set(foo.in, j = c, value = ...) }
Спасибо!!
Комментарии:
1.
foo.in
составляет 100 строк.foo.out
это 10 строк. Вы агрегируете и обобщаете данные. Хотяset()
это может быть полезно для некоторых вариантов использования, этот пример не является отличным вариантом использования из-за агрегирования.2. @Cole О, хорошо, спасибо, я думал, что все наоборот. Спасибо вам за информацию. Но, может быть, вы могли бы помочь мне найти правильный синтаксис с
set()
помощью ? Я все еще не могу этого сделать.3. Я не могу придумать логический способ агрегирования при использовании набора. Пожалуйста , посмотрите
?set
, но основной вариант использованияset
-это когда вам приходится звонить[.data.table
много раз, и вы хотите меньше накладных расходов. В исходном примере вы звоните только[.data.table
один раз. Наконец, посмотрите свое » значение = …. This is hard! and it is hard because we need to aggregate. And one way to aggregate efficiently is to directly aggregate within a
[.данные.таблица` вызов.