[英]plyr ddply and summarise use in R
嗨,我想避免使用循環,所以想要使用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
但ddply
如何操作以便我可以將列名作為參數。
謝謝
這就是你要追求的嗎?
> 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)]}
這似乎非常適合data.table
和lapply(.SD,FUN)
和.SDcols
參數
.SD
是一個data.table,包含每個組的x的數據子集,不包括組列。 .SDcols
是一個向量,包含要應用該函數的列的名稱( FUN
) 設置data.table
library(data.table)
DT <- as.data.table(df)
f
, x
, y
, z
列的總和
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
和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
計算平均值的示例
DT[, lapply(.SD, mean), by = f, .SDcols = c("x", "y", "z")]
## f x y z
## 1: 4 0.36955 0.30606 0.09630
## 2: 2 0.10232 -0.07407 0.26412
## 3: 3 0.07461 -0.01193 -0.66059
## 4: 9 0.15123 -0.08489 0.07004
## 5: 5 -0.01425 -0.28346 0.56298
## 6: 10 -0.21075 0.04069 -0.02799
## 7: 1 0.29544 -0.31139 -0.13884
## 8: 8 -0.54360 0.08617 0.17744
## 9: 7 0.38586 0.10790 0.45305
## 10: 6 -0.07844 0.50710 0.45782
DT[, lapply(.SD, mean), by = f, .SDcols = c("x", "z")]
## f x z
## 1: 4 0.36955 0.09630
## 2: 2 0.10232 0.26412
## 3: 3 0.07461 -0.66059
## 4: 9 0.15123 0.07004
## 5: 5 -0.01425 0.56298
## 6: 10 -0.21075 -0.02799
## 7: 1 0.29544 -0.13884
## 8: 8 -0.54360 0.17744
## 9: 7 0.38586 0.45305
## 10: 6 -0.07844 0.45782
我沒有足夠的評論來評論所以必須在答案形式中詢問 - 你為什么要避免在R中使用循環?
編輯:無論如何使用plyr我會使用count()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.