7

使用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——我猜这是一个与如何dplyr接口的错误data.table

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

4

1 回答 1

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()的假设是索引将使未来的操作更快。

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

于 2014-03-19T20:46:15.757 回答