7

I を使用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方法のバグだと思います)dplyrdata.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

これは、インデックスが将来の操作を高速化するという前提で 自動的に do にgroup_by()適用されるために発生します。data.tablesetkey()

これが悪いデフォルトだと強く感じた場合は、喜んで変更します。

于 2014-03-19T20:46:15.757 に答える