Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数中具有多个参数的R聚合_R_Dataframe_Aggregate - Fatal编程技术网

函数中具有多个参数的R聚合

函数中具有多个参数的R聚合,r,dataframe,aggregate,R,Dataframe,Aggregate,Im尝试通过在data.frame上使用聚合来避免耗时的for循环。但我需要在最后的计算中输入其中一列的值 dat <- data.frame(key = c('a', 'b', 'a','b'), rate = c(0.5,0.4,1,0.6), v1 = c(4,0,3,1), v2 = c(2,0,9,4)) >dat key rate v1 v2 1 a 0.5 4 2 2 b 0.4 0 0 3 a 1.0 3 9 4 b 0

Im尝试通过在data.frame上使用聚合来避免耗时的for循环。但我需要在最后的计算中输入其中一列的值

dat <- data.frame(key = c('a', 'b', 'a','b'), 
rate = c(0.5,0.4,1,0.6), 
v1 = c(4,0,3,1), 
v2 = c(2,0,9,4))

>dat
  key rate v1 v2
1   a  0.5  4  2
2   b  0.4  0  0
3   a  1.0  3  9
4   b  0.6  1  4

aggregate(dat[,-1], list(key=dat$key),  
    function(x, y=dat$rate){
        rates <- as.numeric(y)
        values <- as.numeric(x)
        return(sum(values*rates)/sum(rates))
    })
dat-dat
密钥速率v1 v2
1 a 0.5 4 2
2 b 0.4 0 0
3 a 1.0 3 9
4B0.614
聚合(dat[,-1],列表(键=dat$键),
函数(x,y=dat$速率){

费率一种解决方案是使用
plyr
软件包中的
ddply

res = ddply(dat, .(key), summarise, result = sum(v1 * rate) / sum(rate))
> res
  key   result
1   a 3.333333
2   b 0.600000
DT <- data.table(dat, key = "key")
DT[, list(v1 = sum(rate * v1)/sum(rate), v2 = sum(rate * v2)/sum(rate)), by = "key"]
#    key       v1       v2
# 1:   a 3.333333 6.666667
# 2:   b 0.600000 2.400000
如果要将此应用于所有
v
列,我建议首先稍微更改一下数据结构:

dat = melt(dat, id.vars = c("key", "rate"))
> dat
  key rate variable value
1   a  0.5       v1     4
2   b  0.4       v1     0
3   a  1.0       v1     3
4   b  0.6       v1     1
5   a  0.5       v2     2
6   b  0.4       v2     0
7   a  1.0       v2     9
8   b  0.6       v2     4
然后再次使用
ddply

res = ddply(dat, .(key, variable), summarise, result = sum(value * rate) / sum(rate))
> res
  key variable   result
1   a       v1 3.333333
2   a       v2 6.666667
3   b       v1 0.600000
4   b       v2 2.400000
…或者您需要标准的R解决方案,您可以使用

res = by(dat, list(dat$key), function(x) sum(x$v1 * x$rate) / sum(x$rate))
> res
: a
[1] 3.333333
------------------------------------------------------------ 
: b
[1] 0.6

以下是我通过使用“
data.table
”包实现的目标:

第二,合计:

datDT[, lapply(.SD, function(x, y = rate) sum(y * x)/sum(y)), by = "key"]
#    key      rate       v1        v2       v3       x1       x2       x3
# 1:   a 0.6501303 6.335976  8.634691 15.75915 3.363832 7.658762 13.19152
# 2:   b 0.7375793 3.595585 10.749705 16.26582 2.792390 7.741787 12.57301
如果您有一个非常大的数据集,通常可能需要浏览
data.table


值得一提的是,我在BaseR中也取得了成功,但我不确定这会有多高效,特别是因为转置等等

t(sapply(split(dat, dat[1]), 
         function(x, y = 3:ncol(dat)) {
           V1 <- vector()
           for (i in 1:length(y)) {
             V1[i] <- sum(x[2] * x[y[i]])/sum(x[2])
           }
           V1
         }))
#       [,1]      [,2]     [,3]     [,4]     [,5]     [,6]
# a 6.335976  8.634691 15.75915 3.363832 7.658762 13.19152
# b 3.595585 10.749705 16.26582 2.792390 7.741787 12.57301
t(sapply(split)(dat,dat[1]),
函数(x,y=3:ncol(dat)){

V1谢谢您的回答,但这并不是我想要的!我有更多的列,因此需要为所有
V
列复制此解决方案!最后使用cbind(?)我扩展了我的答案以包括这个附加要求。试图更具体一些:每个
V
列必须是一个函数的结果,该函数依赖于
V
本身和列
速率,按
值分组。我试图避免数据的重组,因为这将导致表有5.600.000行。最后,我将不得不做与原始结构相反的事情。但是如果没有其他方法…谢谢你的帮助!我估计
datDT[,lapply(.SD,function(x,y){sum(x*y)/sum(y)},y=rate),by=key][,setdiff(names(datDT),'rate'),with=F]
可以做到这一点,而且更容易理解。您甚至可以使用加权的
替换匿名函数。如果want@mnel,我在此完全期待您的意见;)几天前,我刚开始探索
数据表
。@mnel,关于
加权平均值的使用,我想最好还是保留它,因为我正在考虑OP问题的标题。:。附加
[,setdiff(names(datDT),'rate'),with=F]
将删除
费率
列-此列没有特别的意义这些答案对你来说是否可行?
t(sapply(split(dat, dat[1]), 
         function(x, y = 3:ncol(dat)) {
           V1 <- vector()
           for (i in 1:length(y)) {
             V1[i] <- sum(x[2] * x[y[i]])/sum(x[2])
           }
           V1
         }))
#       [,1]      [,2]     [,3]     [,4]     [,5]     [,6]
# a 6.335976  8.634691 15.75915 3.363832 7.658762 13.19152
# b 3.595585 10.749705 16.26582 2.792390 7.741787 12.57301