我有一个看起来像这样的数据帧狗:
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的所有计数,并串联该Dogid的所有房屋和学校价值(无重复)。
因此,在上面的示例中,我希望我的表看起来像这样:
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),与学校相同,然后具有dogid最初具有的所有行的每个计数列的组合计数。
我将如何处理?
我们可以dplyr
用来获取汇总输出。我们按“dogid”,使用summarise
到paste
的unique
元素在“家”,“学校”分开,并做sum
了与“月”开始的列名。
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
列使用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
dogs <- structure(list(dogid = c(12345L, 12345L, 31323L, 41213L, 41213L,
41213L), home = c("a", "b", "g", "a", "g", "c"), school = c("a",
"a", "c", "b", "c", "b"), month1year2014trainingtype1 = c(340L,
10L, 500L, 200L, 500L, 400L), month2year2014trainingtype1 = c(360L,
0L, 550L, 400L, 100L, 20L)), .Names = c("dogid", "home", "school",
"month1year2014trainingtype1", "month2year2014trainingtype1"),
class = "data.frame", row.names = c(NA, -6L))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句