2016-08-12 87 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