[英]R aggregate data by defining grouping
我无法对R中的后续数据进行分组和汇总:
category freq
1 C1 9
2 C2 39
3 C3 3
4 A1 38
5 A2 2
6 A3 29
7 B1 377
8 B2 214
9 B3 790
10 B4 724
11 D1 551
12 D2 985
13 E5 19
14 E4 28
看起来像这样:
category freq
1 A 69
2 B 2105
3 C 51
4 D 1536
5 E 47
我通常使用ddply按属性聚合数据,但这只是在给定列中添加具有相同属性的所有值行。 我需要能够指定应归入一个类别的多个属性。
为什么不在数据框中添加一列,这将是“类别”列的字母部分。 然后,你可以使用ddply
。
例:
df = data.frame(id = c(1,2,3,4,5), category = c("AB1", "AB2", "B1", "B2", "B3"), freq = c(50,51,2,26))
df$new = as.factor(gsub("\\d", "", df$category))
然后,您可以根据新列使用ddply
,如下所示:
library(plyr)
aggregate <- ddply(df, .(new), summarize, freq = sum(freq))
您会得到以下结果:
# new freq
#1 AB 101
#2 B 31
只有当您打算在同一伞类别下将所有类别与类似的“字母”子字符串分组时,这才有效。
但是,如果您希望将自定义类别分组到一个类别下(您的示例:KG,XM和L4将属于同一类别),您可以定义新的“超级”类别,并将每个子类别分配给相应的类别“超级”类别。 我能想到的一种方法是switch
功能。 请看下面的例子:
df = data.frame(id = c(1,2,3,4,5), category = c("A", "B", "KG", "XM", "L4"), freq = c(50,51,3,2,26))
fct <- function(cat) {switch(cat, "A" = "CAT1", "B" = "CAT2", "KG" = "CAT3", "XM" = "CAT3", "L4"="CAT3")}
df$new = as.factor(unlist(lapply(df$category, fct)))
aggregate <- ddply(df, .(new), summarize, freq = sum(freq))
这会给你:
# new freq
#1 CAT1 50
#2 CAT2 51
#3 CAT3 31
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.