簡體   English   中英

R data.table使用列作為跨因子水平的變量來計算公式

[英]R data.table to calculate a formula using a column as a variable across levels of a factor

我想使用數據表公式計算因子(C1)的所有級別上的輸出sum_logloss(請參見下文)。 但是結果卻不是我所期望的。 這是一個小示例,顯示了我得到的結果以及為什么期望以不同的sum_logloss作為結果。

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

因此C1 = 1的sum_logloss應該是2 * LogLoss(1,0.6666667)+ 1 * LogLoss(0,0.6666667)= 1.909543,而不是3.663061。

小提示:我建議使用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]

你可以試試

 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM