2014-01-15 3 views
4

Предположим, что у меня есть data.table следующим образом -:Использование .N и .sd в одном вызове

data = data.table(c("a","a","b","b","c"),c(1,2,3,4,5)) 

Я хотел бы подвести числовой вектор, только тогда, когда вектор фактор имеет более чем один вход , У меня есть проблема с использованием .SD. Я понимаю, что я мог бы создать поле N с помощью

data[ , N := .N, by = V1] 

, а затем просуммировать по

data[N > 1, lapply(.SD,sum), by = V1, .SDcols = 2] 

Однако, есть один шаг вызова, чтобы сделать это?

Реферирование .sd в вызове не возвращает ответ -

data[, lapply(.SD[which(length(.SD)>1)],sum), by = V1, .SDcols = 2] 

Я хотел бы понять, почему это не работает. Не имеет значения: -

data[, lapply(.SD[which(.N>1)],sum), by = V1, .SDcols = 2] 

Спасибо!

+7

Как насчет 'data [, if (.N> 1) lapply (.SD, sum), by = V1]'? – Arun

ответ

7
data <- data.table(c("a","a","b","b","c"),c(1,2,3,4,5)) 
data[, if(.N > 1) lapply(.SD, sum) else NULL, by=V1] 
# V1 V2 
# 1: a 3 
# 2: b 7 
+0

Jeez, @Arun, я думаю, что наши ответы идентичны по характеру (nm, 'else NULL' не нужно, не думал) – BrodieG

+0

Спасибо! Любая идея, почему мои другие варианты не сработали? – RonRich

+0

@ user2006864 Подмножество '.SD' будет просто возвращать столбцы из' .SD' (и это то, что вы пытаетесь сделать в обоих примерах), тогда как вам нужно вернуть все '.SD', если у него больше чем 1 _row_, а затем суммировать столбцы. Обратите внимание, как наше решение не подмножает '.SD' вообще. – BrodieG

Смежные вопросы