2016-08-12 24 views
0

私は解決しようとしているユニークな問題があります。リスト内のデータフレームをグループ化する

私は、いくつかの異なるタイプの情報を含むデータテーブルを持っています。 例。

私がやろうとしています何
ID|inpSeq|Act |User |Representing 
--|----- |----|---- |----- 
1 | 123 | s | ABC | NA 
1 | 124 | s | ABC | NA 
1 | 125 | c | ABC | x1 
1 | 126 | c | XYZ | x2 
1 | 127 | d | ABC | x2 

は、「ユーザー」が「Repres」つまり

に関し、私は次の出力

ID|Act |User|.... 
--|------|----|----|---- 
1 | sscd | ABC| x1 | x2..... 
1 | c | XYZ| x2..... 
を作成するために探していますどのように表示してデータを整理することです

元の表が「ユーザー」中心のビューに圧縮され、「Act」にUserが単一IDで実行したすべてのアクティビティが含まれるようになりました。

さらに、私はこのアクティビティを整理していますが、私は(彼らとは異なる場合は)誰が代理を行ったのかを示す必要があります。これは、x1、x2 .....で表されます。これは、各ID/Act/Userの組み合わせに対して固有の「Representing」パーティが存在するかどうかによって、これが大きくなる可能性があることを意味します。

重要なことは、Actフィールドの "s"の値は、Representingフィールドに常にNAを持つことです。したがって、それらのNAでは、変換されたビューに含める必要はありません。

は今、これまで私は、コードのID|Act|User一部を取得することができた次のコード

aggregate(Act~ID+User, paste, collapse="", data=df) 

を使用して考え出したしかし、私は残りの部分を行う方法を把握する必要があります。それが私の助けが必要な場所です。

P.S. "inpSeq"フィールドは、外部アプリケーションによって順番に作成され、正しい順番でアクティビティの順序付けを可能にするユニークな数値フィールドです。データフレームdfとしてあなたのデータで

+1

あなたは、データフレームの単一セルの値の一覧を可能tidyr' 'で' nest'機能を検討する必要があります。 https://blog.rstudio.org/2016/02/02/tidyr-0-4-0/をご覧ください。 –

答えて

0

、あなたが欲しいものを手に入れるtidyrからspread機能をdplyrを使用することができます。

library(dplyr) 
library(tidyr) 

f <- function(x) { paste(na.omit(x), collapse="") }   ## 1. 

result <- df %>% spread(Representing, Representing) %>%  ## 2. 
       select(-inpSeq, -`<NA>`) %>%    ## 3. 
       group_by(ID, User) %>%      ## 4. 
       summarise_each(funs(f))) 

がNotes:

  1. 私たちは、その機能fを定義します文字のベクトルを1つの文字列に折り畳み、その過程でNAを省略します。
  2. spreadの最初の引数は、キーの列名であり、第二の引数は、の列名です。 spread関数は、を複数の列に展開します。これらの追加の列は、のキーによって名前が付けられます。ここでは、Representingの行を、Representingの行の名前を付けた複数の列に分散します。あなたのデータのちょうどそのコマンドの結果が得られます。オリジナルRepresenting列を置き換える

    ## ID inpSeq Act User x1 x2 <NA> 
    ##1 1 123 s ABC <NA> <NA> <NA> 
    ##2 1 124 s ABC <NA> <NA> <NA> 
    ##3 1 125 c ABC x1 <NA> <NA> 
    ##4 1 126 c XYZ <NA> x2 <NA> 
    ##5 1 127 d ABC <NA> x2 <NA> 
    

    x1という名前の3つの追加の列が今そこにあることに注意してください、x2、および<NA>を。

  3. この結果から、inpSeq<NA>という列を省略すると、selectが使用されます。我々が定義された関数fを使用して残りの列の

  4. 我々その後、group_byIDUsersummaries_each

結果は次のとおりです。

print(result) 
##Source: local data frame [2 x 5] 
##Groups: ID [?] 

##  ID User Act x1 x2 
## <int> <fctr> <chr> <chr> <chr> 
##1  1 ABC sscd x1 x2 
##2  1 XYZ  c   x2 
+0

これは幻想的です!!!!この素晴らしいソリューションをありがとうございました。 – Zlatko

関連する問題