簡體   English   中英

data.table R 按組求和分隔的行

[英]data.table R sum delimited rows by group

我目前有以下 data.table:

   network lead_to_funded_months denominator
 1:      fb                     0   5
 2:      fb                     1   4
 3:      fb                     2   4
 4:      fb                     3   3
 5:      fb                     4   3
 6:      fb                     5   3
 7:      fb                     6   5
 8:      fb                     7   8
 9:      fb                     8   8
10:      fb                     9   7
11:      fb                    10   5
12:      fb                    11   4
13:      fb                    12   5
14:      fb                    13   8

我想為每個lead_to_funded_months總結除當前lead_to_funded_months行之外的所有以下行。 所以結果將如下所示:

  network lead_to_funded_months     sum(denominator)
 1:      fb                     0   67
 2:      fb                     1   63
 3:      fb                     2   59
 4:      fb                     3   56
 5:      fb                     4   53
 6:      fb                     5   50
 7:      fb                     6   45
 8:      fb                     7   37
 9:      fb                     8   29
10:      fb                     9   22
11:      fb                    10   17
12:      fb                    11   13
13:      fb                    12   8
14:      fb                    13   8

我嘗試了以下代碼,但它只是返回相同的行值:

dt[
     between(lead_to_funded_months, min(lead_to_funded_months + 1 ,13), 13) ,
     .(sum_conversion_curve = sum(denominator)),
     .(lead_to_funded_months, network)
 ]

如果有人能指出我的錯誤和解決方法,我將不勝感激。

data.table選項

dat[, s := sum(denominator) - cumsum(denominator)]

    network lead_to_funded_months denominator  s
 1:      fb                     0           5 67
 2:      fb                     1           4 63
 3:      fb                     2           4 59
 4:      fb                     3           3 56
 5:      fb                     4           3 53
 6:      fb                     5           3 50
 7:      fb                     6           5 45
 8:      fb                     7           8 37
 9:      fb                     8           8 29
10:      fb                     9           7 22
11:      fb                    10           5 17
12:      fb                    11           4 13
13:      fb                    12           5  8
14:      fb                    13           8  0

我們可以使用來自revcumsumspatstat.utils

library(sptastat.utils)
library(data.table)
dt[, s := revcumsum(shift(denominator, type = 'lead', fill = 0))]

-輸出

 dt
    network lead_to_funded_months denominator  s
 1:      fb                     0           5 67
 2:      fb                     1           4 63
 3:      fb                     2           4 59
 4:      fb                     3           3 56
 5:      fb                     4           3 53
 6:      fb                     5           3 50
 7:      fb                     6           5 45
 8:      fb                     7           8 37
 9:      fb                     8           8 29
10:      fb                     9           7 22
11:      fb                    10           5 17
12:      fb                    11           4 13
13:      fb                    12           5  8
14:      fb                    13           8  0
library(data.table)
dat[, s := c(rev(cumsum(rev(denominator[-1]))), 0)]
dat
#     network lead_to_funded_months denominator     s
#      <char>                 <int>       <int> <num>
#  1:      fb                     0           5    67
#  2:      fb                     1           4    63
#  3:      fb                     2           4    59
#  4:      fb                     3           3    56
#  5:      fb                     4           3    53
#  6:      fb                     5           3    50
#  7:      fb                     6           5    45
#  8:      fb                     7           8    37
#  9:      fb                     8           8    29
# 10:      fb                     9           7    22
# 11:      fb                    10           5    17
# 12:      fb                    11           4    13
# 13:      fb                    12           5     8
# 14:      fb                    13           8     0

我假設您的第 14 行總和 8 是一個錯誤,因為沒有行可以總結; 它應該是0NA 但是,如果您真的希望它為8 ,只需更改為

dat[, s2 := c(rev(cumsum(rev(denominator[-1]))), denominator[.N])]

數據

dat <- setDT(structure(list(network = c("fb", "fb", "fb", "fb", "fb", "fb", "fb", "fb", "fb", "fb", "fb", "fb", "fb", "fb"), lead_to_funded_months = 0:13, denominator = c(5L, 4L, 4L, 3L, 3L, 3L, 5L, 8L, 8L, 7L, 5L, 4L, 5L, 8L)), class = c("data.table", "data.frame"), row.names = c(NA, -14L)))

創建示例數據集

df <- data.frame(
    lead = 0:13,
    denom = c(5, 4, 4, 3, 3, 3, 5, 8, 8, 7, 5, 4, 5, 8)
)

計算:

# Reverse sort by `lead`
df <- df[order(df$lead, decreasing = T), ]

# Do the cumulative sum
df$sum_denom <- cumsum(df$denom) - df$denom

# Resort by `lead`
df <- df[order(df$lead), ]

結果:

#>    lead denom sum_denom
#> 1     0     5        67
#> 2     1     4        63
#> 3     2     4        59
#> 4     3     3        56
#> 5     4     3        53
#> 6     5     3        50
#> 7     6     5        45
#> 8     7     8        37
#> 9     8     8        29
#> 10    9     7        22
#> 11   10     5        17
#> 12   11     4        13
#> 13   12     5         8
#> 14   13     8         0   # <-- note the 0, not an 8

暫無
暫無

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

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