使用R中的plyr包重命名输出列

11

Hadley向我介绍了plyr包,我发现自己经常使用它来进行“group by”类型的操作。但是我发现自己总是需要重命名生成的列,因为它们默认为V1、V2等。

这里有一个示例:

mydata<-data.frame(matrix(rnorm(144, mean=2, sd=2),72,2),c(rep("A",24),rep("B",24),rep("C",24)))
colnames(mydata) <- c("x_value", "acres",  "state")
groupAcres <- ddply(mydata, c("state"), function(df)c(sum(df$acres)))
colnames(groupAcres) <- c("state","stateAcres")
有没有一种方法可以让ddply为我命名结果列,这样我就可以省略最后一行了?

JD- 那段代码的第一行无法运行,应该是rnorm(...,72,2),例如:mydata<-data.frame(matrix(rnorm(144, mean=2, sd=2),72,2),c(rep("A",24),rep("B",24),rep("C",24)))' - medriscoll
2个回答

19

使用 summarise (或 summarize):

  groupAcres <- ddply(mydata, "state", summarise, 
     myName = sum(acres))

这是解决问题的绝佳方法。我选择了Chris的答案,因为它更通用。将来我会同时使用他的方法和你的方法。但愿我能将它们结合起来或者都接受。 - JD Long
1
我的方法实际上稍微更加通用(因为如果你返回多个类型,它们可以有不同的类型)。我为这个目的编写了summarise。 - hadley
我无法使这个方法起作用,因为我正在使用nrow函数来计算子集数据中的行数,有什么提示吗? - mindless.panda
1
@mindless.panda,你可以在子集数据的列上使用length,而不是nrowddply(mydata, .(state), summarize, count.per.state=length(acres))。(如果你不关心列名,你可以只使用nrow作为聚合函数,但这与本主题的目的相悖。) - Matt Tenenbaum

11

这似乎有效:

> groupAcres <- ddply(mydata, c("state"), function(df) c(myName=sum(df$acres)))
> groupAcres
  state   myName
1     A 56.87973
2     B 57.84451
3     C 52.82415

5
我在使用R语法时勉强能应付,但并不真正理解它。为什么需要使用连接函数呢? - Farrel
@Farrel:给数据项命名。使用 data.frame 也可以。 - krlmlr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接