Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.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 data.table使用列作为系数级别的变量来计算公式_R_Data.table - Fatal编程技术网

R data.table使用列作为系数级别的变量来计算公式

R data.table使用列作为系数级别的变量来计算公式,r,data.table,R,Data.table,我想使用数据表公式计算系数(C1)所有级别的输出和损失(见下文)。但结果并不是我所期望的。下面是一个小例子,说明了我得到了什么,以及为什么我期望结果是不同的和损失 LogLoss <- function(actual, predicted, eps=0.00001) { predicted <- pmin(pmax(predicted, eps), 1-eps) -1/length(actual)*(sum(actual*log(predicted)+(1-actual)*l

我想使用数据表公式计算系数(C1)所有级别的输出和损失(见下文)。但结果并不是我所期望的。下面是一个小例子,说明了我得到了什么,以及为什么我期望结果是不同的和损失

LogLoss <- function(actual, predicted, eps=0.00001) {
  predicted <- pmin(pmax(predicted, eps), 1-eps)
  -1/length(actual)*(sum(actual*log(predicted)+(1-actual)*log(1-predicted)))
}

# THIS RETURNS TOTAL LOGLOSS
TotalLogLossVector <- function(actual_vector, predicted_vector) {
sum(mapply(LogLoss, actual_vector, predicted_vector))
}

df = data.frame(C1=c(1,1,2,2,1), C2=c(4,5,4,5,5), click=c(1,0,0,1,1))
df <- data.table(df)
df
   C1 C2 click
1:  1  4     1
2:  1  5     0
3:  2  4     0
4:  2  5     1
5:  1  5     1
df[,list(mean_CTR=mean(click),count=.N, sum_logloss=TotalLogLossVector(click,rep(mean_CTR,.N)) ),by=C1]
   C1  mean_CTR count sum_logloss
1:  1 0.6666667     3    3.663061
2:  2 0.5000000     2    1.928626

LogLoss(1,0.6666667)
[1] 0.4054651
LogLoss(0,0.6666667)
[1] 1.098612
TotalLogLossVector(c(1,0,1), c(0.6666667,0.6666667,0.6666667))
[1] 1.909543
LogLoss你可以试试

 df[, paste0('V', 1:2):=list(mean(click), .N), by=C1][,
    list(mean_CTR=V1[1L], count=V2[1L], sum_logloss=
              TotalLogLossVector(click, V1)), by=C1]

 #  C1  mean_CTR count sum_logloss
 #1:  1 0.6666667     3    1.909543
 #2:  2 0.5000000     2    1.386294

一个小提示:我建议
setDT()
将data.frames转换为data.tables,特别是当您将data.table重新分配给同一个变量时


@akrun的答案很好,但它分了两组,我觉得这是不必要的。我是这样做的:

setDT(df)[, {
    tmp = mean(click);
    list(mean_CTR = tmp, count = .N, sum_logloss = 
         TotalLogLossVector(click, tmp))}, by=C1]

这就是我要找的,但不知何故我把
{
放错了位置(+1)@akrun,啊,我明白了。下一次:-)。图森,我看到你没有接受数据表标签下的一些答案:,。我没有看到你跟进的任何问题。有什么特别的原因你没有接受吗?而且你似乎已经从akrun的这里删除了接受的答案…只是想知道。@Arun是的,我的错,我经常想做double-确保答案是正确的,有时不需要花时间回来验证。图森,我明白了。这很好,但如果你能够跟进(如果你必须这样做),并在这些问题确实回答了你的问题后关闭这些问题,那就太好了。谢谢。