我有一个看起来像这样的数据帧狗:
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) ,同样适用于学校,然后具有最初所有行的每个计数列的合并计数。
我该怎么做?
答案 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
如果我们有paste
个unique
元素的多列,以及另一组要获取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