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

时间:2014-02-12 00:43:36

标签: r data.table dplyr

使用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

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的哲学没有在适当的地方进行修改,这对我来说有点混乱 - 我猜这是一个怎样的错误{ {1}}与dplyr)接口

实现上述目标的data.table方法是什么?

1 个答案:

答案 0 :(得分: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() 未来的运营速度更快。

如果有强烈的感觉,这是一个不好的默认值,我很乐意改变它。