plyr ddply并总结在R中使用

时间:2012-08-23 08:49:25

标签: r dataframe plyr data.table subset

您好我想避免使用循环,所以想要使用plyr中的某些东西来帮助解决我的问题。

我想创建一个函数,从数据框中获取每个因子的特定列的总和。

因此,如果我们有以下示例数据......

df <- data.frame(cbind(x=rnorm(100),y=rnorm(100),z=rnorm(100),f=sample(1:10,100, replace=TRUE))) 
df$f <- as.factor(df$f)

即。我想要像:

foo <- function(df.obj,colname){
     some code
}

df.obj上面的df变量,colname参数可以是xyz中的任意一个。

我希望函数的输出/结果有一列唯一因子(在上面的例子中为1:10),以及每个因子列x的值的总和。

我希望解决方案非常简单,可能会以某种方式使用ddplysummarise,但无法解决如何操作以便我可以将列名作为参数

由于

3 个答案:

答案 0 :(得分:2)

这就是你要追求的吗?

> ddply(df, .(f), colwise(sum))
    f          x           y          z
1   1 -0.4190284  2.61101681  1.2280026
2   2  1.1063977  2.40006922  4.9550079
3   3  0.4498366 -4.00610558  0.9964754
4   4  1.9325488 -2.81241212 -3.1185574
5   5 -4.1077670 -1.01232884 -3.9852388
6   6 -1.0488003 -2.42924689  3.5273636
7   7  2.2999306  0.85930085 -0.6245167
8   8 -4.8105311 -6.81352238 -2.1223436
9   9 -2.8187083  5.03391770  1.6433896
10 10  5.1323666 -0.06192382  1.8978994

编辑:TS提供的正确答案:

foo <- function(df.obj,colname){ddply(df, .(f), colwise(sum))[,c("f",colname)]}

答案 1 :(得分:1)

这似乎非常适合data.table以及lapply(.SD,FUN).SDcols参数

  • .SD是一个data.table,包含每个组的x的数据子集,不包括组列。
  • .SDcols是一个向量,包含您要应用该函数的列的名称(FUN

一个例子

设置data.table

library(data.table)
DT <- as.data.table(df)

x

之后yzf列的总和
DT[, lapply(.SD, sum), by = f, .SDcols = c("x", "y", "z")]

##      f       x       y       z
##  1:  4  4.8041  3.9788  1.2519
##  2:  2  1.1255 -0.8147  2.9053
##  3:  3  0.9699 -0.1550 -8.5876
##  4:  9  2.2685 -1.2734  1.0506
##  5:  5 -0.1282 -2.5512  5.0668
##  6: 10 -2.7397  0.5290 -0.3638
##  7:  1  2.9544 -3.1139 -1.3884
##  8:  8 -4.3488  0.6894  1.4195
##  9:  7  2.3152  0.6474  2.7183
## 10:  6 -0.1569  1.0142  0.9156

x的{​​{1}}和z列的总和

f

计算意味着

的示例
DT[, lapply(.SD, sum), by = f, .SDcols = c("x", "z")]

##      f       x       z
##  1:  4  4.8041  1.2519
##  2:  2  1.1255  2.9053
##  3:  3  0.9699 -8.5876
##  4:  9  2.2685  1.0506
##  5:  5 -0.1282  5.0668
##  6: 10 -2.7397 -0.3638
##  7:  1  2.9544 -1.3884
##  8:  8 -4.3488  1.4195
##  9:  7  2.3152  2.7183
## 10:  6 -0.1569  0.9156

答案 2 :(得分:0)

我没有足够的回复评论,所以必须在回答表格中询问 - 你为什么要避免在R中使用循环?

编辑:无论如何使用plyr我会使用count()

相关问题