2014-02-12 2 views
7

Использование data.table я могу сделать следующее:как я могу мутировать в dplyr, не теряя порядок?

library(data.table) 
dt = data.table(a = 1:2, b = c(1,2,NA,NA)) 
# a b 
#1: 1 1 
#2: 2 2 
#3: 1 NA 
#4: 2 NA 

dt[, b := b[1], by = a] 
# a b 
#1: 1 1 
#2: 2 2 
#3: 1 1 
#4: 2 2 

Попытка ту же операцию в dplyr однако получает данные вскарабкался/сортируются по a:

library(dplyr) 
dt = data.table(a = 1:2, b = c(1,2,NA,NA)) 
dt %.% group_by(a) %.% mutate(b = b[1]) 
# a b 
#1 1 1 
#2 1 1 
#3 2 2 
#4 2 2 

(как в сторону вышеперечисленного также сортирует оригинал dt, что несколько сбивает меня с толку, учитывая, что философия dplyr не изменяется на месте - я предполагаю, что это ошибка с тем, как dplyr интерфейсов с data.table)

Какой способ достижения вышеуказанного? dplyr?

+1

Я предполагаю, что это потому, что 'group_by' вызывает' setkey' внутри. В принципе, у него нет 'ad hoc''. Но я могу ошибаться. – Arun

+1

Как раз отметить это не происходит при использовании обычного кадра данных R. – Vincent

+0

Это ошибка. Можете ли вы подать заявку на github? – hadley

ответ

1

В текущей версии развития dplyr (который в конечном счете стать dplyr 0,2) поведение отличается между кадрами данных и данных таблицы:

library(dplyr) 
library(data.table) 

df <- data.frame(a = 1:2, b = c(1,2,NA,NA)) 
dt <- data.table(df) 

df %.% group_by(a) %.% mutate(b = b[1]) 

## Source: local data frame [4 x 2] 
## Groups: a 
## 
## a b 
## 1 1 1 
## 2 2 2 
## 3 1 1 
## 4 2 2 

dt %.% group_by(a) %.% mutate(b = b[1]) 

## Source: local data table [4 x 2] 
## Groups: a 
## 
## a b 
## 1 1 1 
## 2 1 1 
## 3 2 2 
## 4 2 2 

Это происходит потому, что group_by() применяется к data.table автоматически делает setkey() исходя из предположения, что индекс будет делать быстрее .

Если есть сильное чувство, что это плохой дефолт, я рад его изменить.

+0

спасибо, я думаю, что довольно очевидно, что вы хотите одинакового поведения между 'data.frame' и' data.table' и что поведение 'data.frame' является правильным – eddi

+0

аргумент @eddi counter: dplyr должен воспользоваться производительности по умолчанию. По возможности. – hadley

+0

@hadley, идеальной версией было бы разрешить как 'adhoc-by', так и' setkey' во время 'group_by'. В случае, если дизайн невозможен, я бы пошел с 'adhoc-by' лично, как с недавними внутренними оптимизациями в 1.9.0+,' adhoc-by' невероятно быстро. Кроме того, у него нет накладных расходов из-за операции «setkey», которая должна будет переупорядочить все данные (подумайте о данных biggggg). Кроме того, вы добавляете над ним 'copy', что сделает требования к памяти и времени выше. Учитывая все это, если вы должны пойти только с одним из двух, я бы пошел с 'adhoc-by'. – Arun