【问题标题】:Doing counts for a column of a dataframe in R在 R 中对数据框的一列进行计数
【发布时间】:2014-01-10 20:18:24
【问题描述】:

我有一个数据框“samp”,其中有一列(我们称其为“评级”),它具有多个值(假设为以下值之一:“好”、“中”、“坏”。)

我想对其他几个列进行分组,计算“好”、“中”和“差”的频率,并在新列中报告这些频率。 (所以也许 col1 是电影年份,col2 是流派,然后应该有另外三列告诉您每种类型的评分有多少对于每个年份和流派。)

 ddply(samp,c("col1","col2"), summarize, 
       good=table(samp$rating)["good"],
       medium=table(samp$rating)["medium"],
       bad=table(samp$rating)["bad"])

问题是(我认为)我定义的函数不是 ddply 输出的组,它们只是 samp 的常量函数。如何在此处定义函数,使其成为组的函数?

我尝试使用匿名函数:

 ddply(samp,c("col1","col2"), summarize, 
       good=function(df)table(df$rating)["good"],
       medium=function(df)table(df$rating)["medium"],
       bad=function(df)table(df$rating)["bad"])

但我永远无法让它工作。我认为我从中得到最多的错误是

 Error in output[[var]][rng] <- df[[var]] : 
 incompatible types (from closure to logical) in subassignment type fix

所以把它放在我身上。当我在尝试 ddply 和 table 的 948506 组合时犯错时没有出现的可笑简单的解决方案是什么?谢谢。

【问题讨论】:

  • 您只想要计数吗? length(samp$rating == 'good') 怎么样
  • @rawr 此命令将返回逻辑向量的长度,不计算TRUEs。

标签: r dataframe plyr


【解决方案1】:

只需删除 ddply 内的所有 samp$ 实例,它就会起作用:

ddply(samp,c("col1","col2"), summarize, 
  good=table(rating)["good"],
  medium=table(rating)["medium"],
  bad=table(rating)["bad"])

【讨论】:

  • 啊,我可以发誓我试过了,但是是的,就是这么简单。感谢您解决这个问题!
【解决方案2】:

通用数据:

samp <- data.frame(rating=c("bad","medium","good","bad","medium","good"),
                   col1=c(2007,2010,2007,2009,2010,2010),
                   col2=c("fiction","fiction","fiction","drama","drama","drama"))

代码(你不应该在列名之前使用samp$):

ddply(samp,c("col1","col2"), summarize, 
      good=sum(rating == "good"),
      medium=sum(rating == "medium"),
      bad=sum(rating == "bad"))

输出:

  col1    col2 good medium bad
1 2007 fiction    1      0   1
2 2009   drama    0      0   1
3 2010   drama    1      1   0
4 2010 fiction    0      1   0

【讨论】:

  • Sven 得到检查以修复我的哑 table() 用法,但我要感谢您提供新版本。我更喜欢输出,我可能会应用这种方法。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 2022-09-27
相关资源
最近更新 更多