如何在dplyr中变异而不会丢失顺序?

edd*_*ddi 7 r dplyr data.table

使用data.table我可以执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,上面也对原文进行了排序dt,这对我来说有些令人困惑,因为我dplyr的哲学没有修改到位 - 我猜这是一个如何dplyr与界面相关的错误data.table)

dplyr实现上述目标的方法是什么?

had*_*ley 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
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为group_by()应用于data.table 自动执行时setkey()假设该索引将使未来的操作更快。

如果有强烈的感觉这是一个糟糕的默认设置,我很乐意更改它。