您好我想避免使用循环,所以想要使用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参数可以是x
,y
或z
中的任意一个。
我希望函数的输出/结果有一列唯一因子(在上面的例子中为1:10),以及每个因子列x的值的总和。
我希望解决方案非常简单,可能会以某种方式使用ddply
或summarise
,但无法解决如何操作以便我可以将列名作为参数
由于
答案 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
y
,z
,f
列的总和
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()