R中因子的总计数总和

时间:2014-11-12 19:55:38

标签: r grouping aggregate

我是R的新手,这是我的第一个堆栈溢出问题所以我希望这可能有点粗糙。我有一个数据框(来自.csv),结构如下:

FeatureName     Uuid     Count 

ClickHeadline   ABC1     17 
ChangeSetting   ABC1     3  
ClickHeadline   CBA2     5 
ChangeSetting   CBA2     7 
SomethingElse   CBA2     5

我试图弄清楚如何创建一个新的数据框,其中FeatureName的唯一值,因子ClickHeadline,ChangeSetting,SomethingElse现在是每个Uuid的Count的变量。所以我想要的新数据框是:

Uuid    ClickHeadline    ChangeSetting    SomethingElse
ABC1    17               3                0
CBA2    5                7                5

我觉得我应该能够在聚合函数上做到这一点,但我无法弄清楚如何告诉它通过变量来计算总数。我知道我已经超越了我的头脑,但任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

有很多种可能性

如果您需要sum,还可以使用reshape2dcast功能

df <- read.table(header=T, text='
                 FeatureName     Uuid     Count 

ClickHeadline   ABC1     17 
ChangeSetting   ABC1     3  
ClickHeadline   CBA2     5 
ChangeSetting   CBA2     7 
SomethingElse   CBA2     5
                 ')

library(reshape2)
dcast(df, Uuid ~ FeatureName, value.var="Count", sum)

  Uuid ChangeSetting ClickHeadline SomethingElse
1 ABC1             3            17             0
2 CBA2             7             5             5

如果数据集仅限于您提供的范围,则可以使用基本reshape函数

out <- reshape(df, idvar="Uuid", timevar="FeatureName", v.names="Count", direction="wide")
out[is.na(out)] = 0
out
  Uuid Count.ClickHeadline Count.ChangeSetting Count.SomethingElse
1 ABC1                  17                   3                   0
3 CBA2                   5                   7                   5

另一个基本R替代方案是xtabs,无需删除NA

xtabs(Count ~ Uuid+FeatureName, df)
      FeatureName
Uuid   ChangeSetting ClickHeadline SomethingElse
  ABC1             3            17             0
  CBA2             7             5             5
带有tidyr

spread包解决方案

library(tidyr)
spread(df, key=FeatureName, value=Count, fill=0)
  Uuid ChangeSetting ClickHeadline SomethingElse
1 ABC1             3            17             0
2 CBA2             7             5             5