16

次のことを行うためにどの関数を使用すればよいかわかりません。

library(data.table)
dt = data.table(a = 1:4, b = 1:2)

dt[, rep(a[1], 3), by = b]
#   b V1
#1: 1  1
#2: 1  1
#3: 1  1
#4: 2  2
#5: 2  2
#6: 2  2

summariseとの両方mutateがこの長さに不満を持っています:

library(dplyr)
df = data.frame(a = 1:4, b = 1:2)

df %.% group_by(b) %.% summarise(rep(a[1], 3))
#Error: expecting a single value

df %.% group_by(b) %.% mutate(rep(a[1], 3))
#Error: incompatible size (3), expecting 2 (the group size) or 1
4

2 に答える 2

13

バージョン 0.2では、演算子dplyrを使用してこれを行うことができました。do

> df %>% group_by(b) %>% do(data.frame(a = rep(.$a[1], 3)))
#Source: local data frame [6 x 2]
#Groups: b
#
#  b a
#1 1 1
#2 1 1
#3 1 1
#4 2 2
#5 2 2
#6 2 2
于 2014-08-14T15:12:04.130 に答える
7

@beginneRの答えは機能しますが、data.table動作の実際の代替物ではないようです。検討:

df <- data.frame(a = 1, b = rep(1:1e4, 2))
dt <- data.table(df)
microbenchmark(times=5,
  dt[, rep(a[1], 3), by = b],
  df %>% group_by(b) %>% do(data.frame(a = rep(.$a[1], 3)))
)

実装がdplyr200 倍以上遅くなります。

Unit: milliseconds
                                                      expr        min         lq     median         uq
                                dt[, rep(a[1], 3), by = b]   13.14318   13.70248   14.60524   15.26676
 df %>% group_by(b) %>% do(data.frame(a = rep(.$a[1], 3))) 3269.40731 3359.11614 3583.19430 3736.67162

eachdoを呼び出す必要がない、これを行うためのより良い方法があるかもしれません。また、構文は非常に単純なものに対して少し複雑です。data.framedodata.table

それ以外の場合は、 Hadley の問題リンクdplyrによると、これは次のリリースと思われる 3.1 で実装される予定のようです。

于 2014-11-06T14:13:28.340 に答える