2016-08-12 69 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..... 

因此,您可以看到原始表格被壓縮到「用戶」中心視圖中,而「行爲」現在包含用戶在單個ID上執行的所有活動。

此外,我有一個這個活動進行了整理,我需要(動態地,如果不同)顯示誰代表他們執行活動。這表示爲x1,x2 ......這意味着這可以增長,這取決於每個ID /動作/用戶組合對於唯一的「代表」各方的可能性如何。

需要注意的重要一點是Act字段中的「s」值在代表字段中始終爲NA。所以在那些NA中不需要包含在轉換後的視圖中。

現在爲止我能得到的代碼ID|Act|User部分想通了,通過使用下面的代碼

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

但我需要弄清楚如何做休息。那是我需要你所有幫助的地方。

P.S. 「inpSeq」字段是由外部應用程序按順序創建的唯一數字字段,它允許按正確的順序排列活動。

+1

你可能要考慮在'了'nest'功能tidyr'它允許在數據幀的單個細胞值的列表。請參閱:https://blog.rstudio.org/2016/02/02/tidyr-0-4-0/。 –

回答

0

與您的數據作爲數據幀df,您可以使用dplyrtidyrspread功能得到你想要的東西:

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))) 

注:

  1. 我們定義一個函數f那將字符向量摺疊爲單個字符串,並在此過程中省略。
  2. 的第一個參數spread是用於和第二參數中的列名的列名。 spread函數將的值分散到多個列中。這些附加列由命名。在這裏,我們將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三個附加列,x2,並<NA>取代了原有的Representing列。

  3. 從這個結果,我們使用select來省略列inpSeq<NA>

  4. 然後我們group_byIDUser和使用我們定義的函數f剩餘的列的summaries_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