R:按另一列中的值连接所有条目并添加其计数

时间:2015-08-28 02:03:54

标签: r formatting

我有一个看起来像这样的数据帧狗:

dogid  home  school  month1year2014trainingtype1  month2year2014trainingtype1
12345  a     a       340                          360
12345  b     a       10                           0
31323  g     c       500                          550
41213  a     b       200                          400
41213  g     c       500                          100
41213  c     b       400                          20

除了有更多的计数列(12个月,2年和2个培训类型的每个组合)。目前,对于dogid,home和school的每个独特组合,都有一个单独的行,其中包含单独的计数。我想要做的是结合每个小狗的所有计数,并连接所有家庭和学校的价值,这些都是那个小狗(没有重复)。

所以在上面的例子中,我希望我的表看起来像:

dogid  home  school  month1year2014trainingtype1  month2year2014trainingtype1
12345  a|b   a       350                          360
31323  g     c       500                          550
41213  a|g|c b|c     1100                         520

因此每个dogid都有一行,home列列出了为该dogid发生的每个家庭(但不重复,例如。不具有b | c | b,而是有b | c) ,同样适用于学校,然后具有最初所有行的每个计数列的合并计数。

我该怎么做?

1 个答案:

答案 0 :(得分:3)

我们可以使用dplyr来获取汇总输出。我们按照' dogid'进行分组,使用summarise paste unique元素在' home',' school'单独使用,sum为以' month'开头的列名称执行。

library(dplyr)
dogs %>% 
   group_by(dogid)%>%
   summarise(home = paste(unique(home), collapse='|'),
             school = paste(unique(school), collapse='|'),
             month1year2014trainingtype1 = sum(month1year2014trainingtype1),
             month2year2014trainingtype1 = sum(month2year2014trainingtype1))

给出输出

# dogid  home school month1year2014trainingtype1 month2year2014trainingtype1
#1 12345   a|b      a                         350                         360
#2 31323     g      c                         500                         550
#3 41213 a|g|c    b|c                        1100                         520

如果我们有pasteunique元素的多列,以及另一组要获取sum的列,我们可以单独使用summarise_each执行此操作,然后使用cbind的{​​{1}}列。在这里,我使用bind_cols来选择从头到尾只有非数字字符串的列名。但是,这也可以通过检查matches

来对列进行子集化来完成
class

数据

dogs1 <- dogs %>%
           group_by(dogid)%>%
           summarise_each(funs(paste(unique(.), collapse='|')),matches('^\\D+$'))


dogs2 <- dogs %>%
           group_by(dogid)%>%
           summarise_each(funs(sum = sum(., na.rm=TRUE)), starts_with('month' ))

bind_cols(dogs1, dogs2[-1])
#  dogid  home school month1year2014trainingtype1 month2year2014trainingtype1
#1 12345   a|b      a                         350                         360
#2 31323     g      c                         500                         550
#3 41213 a|g|c    b|c                        1100                         520