为什么不向数据框添加一列,这将是“类别”列的字母部分。然后,您可以使用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