2016-06-23 5 views
2

この質問は、group_by関数の正しい機能を理解するのに適しています。Rでは、dplyrのgroup_byはどのように機能しますか?

私は5つのバイナリ変数(これらの変数の意味は重要ではない)といくつかのユーザを表す1つの変数idを持つデータフレームを持っているとします。例えば:私は、各ユーザーのためにそれをチェックすることができる機能を構築します

id<- c("A","A" , "B" , "B") 
d<- as.data.frame(id) 
d$d1<- c(1,0,1,0) 
d$d2<- c(1,0,1,0) 
d$d3<- c(0,1,1,0) 
d$d4<- c(0,1,0,1) 
d$d5<- c(0,1,0,0) 
> d 
    id d1 d2 d3 d4 d5 
1 A 1 1 0 0 0 
2 A 0 0 1 1 1 
3 B 1 1 1 0 0 
4 B 0 0 0 1 0 

、AとBは、D5に変数d1はそれらのすべてに1が含まれています。

verificator<- function(d) 
{ 
    r<- prod(apply(d[,2:6],2, sum)) 
    r<- as.logical(r) 
    return(r) 
} 

たとえば、Aユーザーの場合、d1からd5までのすべてに1があります。

verificator(d[1:2,]) 
[1] TRUE 

しかし、Bのユーザーのために、我々は持っている

verificator(d[3:4,]) 
[1] FALSE 

私はD行列を評価するためにdplyr機能を使用する場合、間違って何かがあります:

d2<- d %>% group_by(id) %>% summarise(one = verificator(.)) 
d2 
Source: local data frame [2 x 2] 

    id one 
1 A TRUE 
2 B TRUE 

はなぜこれを行いますが、 Bユーザーに対してTRUEを返しますか?

+1

私はそれが最も優雅だかどうかわからないんだけど、私はおそらく 'D%>%GROUP_BY(ID)%>%summarise_each(低速運行(合計))%>%GROUP_BY(id)を行いたいです%>集約%(1 = as エラー:引数 "d"が指定されていません。 – alistaire

答えて

3

... 2回だけ3回印刷していませんbase R

verificator <- function(x){ 
    as.logical(prod(colSums(x))) 
    } 
c(by(d[-1], d$id, FUN = verificator)) 
# A  B 
#TRUE FALSE 
2

%>%を使用した場合、ドット(.)は、%>%の左側にある式の競合結果を表します。したがって、データフレームdの2度で、verificator()を2回評価するだけです。

これは次のように表示されます。まず、私は完全なデータフレームに適用されるverificator()が実際にTRUEを返すことを確認します、あなたが提案したコードを使用して

verificator_p <- function(d) { 
    print(d) 
    return(verificator(d)) 
} 

verificator(d) 
## [1] TRUE 

その後、私はその引数を出力しますverificator()の別の変形を定義します関数に渡されるのは常に完全なデータフレームであることを示しています。

d %>% group_by(id) %>% summarise(one = verificator_p(.)) 
## Source: local data frame [4 x 6] 
## Groups: id [2] 
## 
##  id d1 d2 d3 d4 d5 
## (fctr) (dbl) (dbl) (dbl) (dbl) (dbl) 
## 1  A  1  1  0  0  0 
## 2  A  0  0  1  1  1 
## 3  B  1  1  1  0  0 
## 4  B  0  0  0  1  0 
## Source: local data frame [4 x 6] 
## Groups: id [2] 
## 
##  id d1 d2 d3 d4 d5 
## (fctr) (dbl) (dbl) (dbl) (dbl) (dbl) 
## 1  A  1  1  0  0  0 
## 2  A  0  0  1  1  1 
## 3  B  1  1  1  0  0 
## 4  B  0  0  0  1  0 
## Source: local data frame [4 x 6] 
## Groups: id [2] 
## 
##  id d1 d2 d3 d4 d5 
## (fctr) (dbl) (dbl) (dbl) (dbl) (dbl) 
## 1  A  1  1  0  0  0 
## 2  A  0  0  1  1  1 
## 3  B  1  1  1  0  0 
## 4  B  0  0  0  1  0 
## Source: local data frame [2 x 2] 
## 
##  id one 
## (fctr) (lgl) 
## 1  A TRUE 
## 2  B TRUE 

私は間違いなくk今、なぜdは、我々が期待される出力を得るために必要がある場合は、1つのオプション我々はまた、からbyを使用してこれを行うことができます

d %>% 
    group_by(id) %>% 
    summarise_each(funs(sum)) %>% rowwise() %>% 
    do(data.frame(id = .[1L], one = as.logical(prod(unlist(.[-1]))))) 
#  id one 
# <fctr> <lgl> 
#1  A TRUE 
#2  B FALSE 

ある

+0

) '引数なしでは間違いなく動作しています...他の方は、より早く実用的な解決策を提供しています。しかし、最初のアプローチが期待どおりに機能しなかった理由を理解するのに役立つ説明が追加されました。 – Stibu

関連する問題