【问题标题】:R aggregate data by defining groupingR通过定义分组聚合数据
【发布时间】:2013-08-21 19:49:06
【问题描述】:

我无法在 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 按属性聚合数据,但这只是在给定列中添加具有相同属性的所有值行。我需要能够指定应归为一类的多个属性。

【问题讨论】:

  • 请看我修改后的答案。我已经包含了一个完整的示例,以及输出的样子。

标签: r dataframe grouping aggregate


【解决方案1】:

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

【讨论】:

  • 我列出的数据只是一个示例,但实际上我需要定义将 KG、XM 和 L4 之类的数据汇总到一个类别中的情况。
  • 没问题。让我相应地修改我的答案并回复您。
  • @Rick 请检查我修改后的答案。我已将 substr 函数替换为 gsub,这将提取列的“字母”部分,无论每个类别名称的长度是多少。
  • @Rick 我刚刚意识到您希望自定义您的类别,而不是基于类别名称的类似“字母”部分的分类。我已经包含了一种可能的方式来实现您正在寻找的东西。请看一下我编辑的答案。希望这会有所帮助。
  • 完美运行!!非常感谢。
猜你喜欢
  • 2016-06-29
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 2011-12-17
  • 2014-03-12
相关资源
最近更新 更多