2016-07-29 5 views
10

かなりの時間data.tableを使用した後、私は今dplyrを試す時間だと思った。楽しいですが、私はどのようにアクセスするのか分かりませんでした。 - 現在のグループ変数 - グループごとに複数の値を返しました。dplyr:現在のグループ変数にアクセス

次の例は、data.tableで正常に動作しています。あなたはdplyr

foo <- matrix(c(1, 2, 3, 4), ncol = 2) 
dt <- data.table(a = c(1, 1, 2), b = c(4, 5, 6)) 

# data.table (expected) 
dt[, .(c = foo[, a]), by = a] 
    a c 
1: 1 1 
2: 1 2 
3: 2 3 
4: 2 4 

# dplyr (?) 
dt %>% 
    group_by(a) %>% 
    summarize(c = foo[a]) 
+2

を使用せずに行うことができます、あなたがそれを行うことができない場合があります、 'do'と試す可能性があります – akrun

+2

'foo [a]'にカンマがありません...とにかく、akrunが示唆しているように、要約はグループごとに1つの行を返すのが好きなので、あまり適していません。 n()aka.Nを返すのが好きなmutateも、dplyrの世界で何かを一緒にハックする必要があります。 – Frank

+0

hm。ありがとう。まだ成功していない:dt%>% group_by(a)%>% do(c = foo [、a]) 私に働くスニペットを表示できますか? –

答えて

7

我々はdplyrからdoを使用することができます。 (他のパッケージは使用されていません)。 doは、行を拡張するのに非常に便利です。我々はdata.frameとラップするだけです。私たちは第一観察

dt %>% 
    group_by(a) %>% 
    do(data.frame(c = foo[, .$a[1]])) 
#  a  c 
# <dbl> <dbl> 
#1  1  1 
#2  1  2 
#3  2  3 
#4  2  4 

これによりサブセットができ

dt %>% 
    group_by(a) %>% 
    do(data.frame(c = foo[, unique(.$a)])) 
#  a  c 
# <dbl> <dbl> 
#1  1  1 
#2  1  2 
#3  2  3 
#4  2  4 

またはその代わりにuniqueのも `summarize`で任意のパッケージ

stack(lapply(split(dt$a, dt$a), function(x) foo[,unique(x)]))[2:1] 
# ind values 
#1 1  1 
#2 1  2 
#3 2  3 
#4 2  4 
7

でこれを書くとどのようにあなたはまだグループの変数にアクセスすることができますが、それは、各グループに1つのユニークな値を持つ法線ベクトルのようなものですので、あなたはその周りuniqueを置けば、それは動作します。そして同時に、dplyrはあなたが必要となり、自動的にdata.tableのような行を展開していないようですunnestパッケージtidyrから:

library(dplyr); library(tidyr) 
dt %>% 
     group_by(a) %>% 
     summarize(c = list(foo[,unique(a)])) %>% 
     unnest() 

# Source: local data frame [4 x 2] 

#  a  c 
# <dbl> <dbl> 
# 1  1  1 
# 2  1  2 
# 3  2  3 
# 4  2  4 

それとも我々はすでにグループ変数を知ってきたことから、スピードアップするためにfirstを使用することができますベクターは、グループごとに同じである:

dt %>% 
     group_by(a) %>% 
     summarize(c = list(foo[,first(a)])) %>% 
     unnest() 

# Source: local data frame [4 x 2] 

#  a  c 
# <dbl> <dbl> 
# 1  1  1 
# 2  1  2 
# 3  2  3 
# 4  2  4 
関連する問題