将列表中的数据框分组

时间:2016-08-12 22:44:05

标签: r dataframe grouping

我有一个我想解决的独特问题。

我有一个数据表,其中包含几种不同类型的信息。 例子如下。

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 / User组合的唯一“代表”方可能如何。

需要注意的一点是,Act字段中的“s”值在代表字段中始终具有NA。所以在那些NA中不需要包含在转换后的视图中。

到目前为止,我已经能够通过使用以下代码获得代码的ID|Act|User部分

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

但我需要弄清楚如何做其余的事情。这就是我需要你所有帮助的地方。

P.S。 “inpSeq”字段是一个唯一的唯一数字字段,由外部应用程序按顺序创建,它允许按正确的顺序排序活动。

1 个答案:

答案 0 :(得分:1)

将您的数据作为数据框df,您可以dplyr使用spread tidyr函数来获取您想要的内容:

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,它将字符向量折叠为单个字符串,并在过程中省略NA个。
  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>
    

    请注意,现在有三个名为x1x2<NA>的其他列替换了原来的Representing列。

  3. 从此结果中,我们使用select来省略列inpSeq<NA>

  4. 然后我们使用我们定义的函数group_by ID User以及其余列的summaries_eachf
  5. 结果是:

    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