R对列表进行添加或删除的滚动计数


df <- data.frame(date = as.Date(c(rep("2022-01-01", 3), 
rep("2022-02-01", 3),
rep("2022-03-01", 4))),
flavor = c("Almond", "Apple", "Apricot", 
"Almond", "Maple", "Mint",
"Apricot", "Pecan", "Praline", "Pumpkin"))
#>          date  flavor
#> 1  2022-01-01  Almond
#> 2  2022-01-01   Apple
#> 3  2022-01-01 Apricot
#> 4  2022-02-01  Almond
#> 5  2022-02-01   Maple
#> 6  2022-02-01    Mint
#> 7  2022-03-01 Apricot
#> 8  2022-03-01   Pecan
#> 9  2022-03-01 Praline
#> 10 2022-03-01 Pumpkin

上面的R数据框逐月跟踪冰淇淋店的冰淇淋口味。在二月份,添加了两种一月份没有的口味(枫树味、薄荷味),删除了两种一月份没有的口味(苹果味、杏味)。在3月份,添加了4种二月份没有的口味(杏味、山核桃味、果仁味、南瓜味),删除了3种二月份没有的口味(杏仁味、枫味、薄荷味)。

#>          date  flavors.added  flavors.removed
#> 1  2022-01-01           <NA>             <NA>
#> 2  2022-02-01              2                2
#> 3  2022-03-01              4                3

我如何写一个R脚本来计算上面的汇总数据帧?也就是说,我想要一个每月添加的、上个月没有的冰淇淋口味的滚动计数,以及每月删除的、上个月有的口味的计数。

使用data.table:

library(data.table)
df2 = setDT(df)[, .(flavors = list(flavor)), date]
for (i in 2:nrow(df2))
set(
df2, i = i, 
j = c('flavors_added', 'flavors_removed'), 
list(length(setdiff(df2$flavors[[i]], df2$flavors[[i-1]])), length(setdiff(df2$flavors[[i-1]], df2$flavors[[i]])))
)
df2
#          date                       flavors flavors_added flavors_removed
#        <Date>                        <list>         <int>           <int>
# 1: 2022-01-01          Almond,Apple,Apricot            NA              NA
# 2: 2022-02-01             Almond,Maple,Mint             2               2
# 3: 2022-03-01 Apricot,Pecan,Praline,Pumpkin             4               3

Indplyr:

library(dplyr)
df %>% 
group_by(date) %>% 
summarise(flavors = list(flavor)) %>% 
mutate(flavors.added = lengths(mapply(setdiff, flavors, lag(flavors))),
flavors.removed = lengths(mapply(setdiff, lag(flavors), flavors)))

输出
# A tibble: 3 × 4
date       flavors   flavors.added flavors.removed
<date>     <list>            <int>           <int>
1 2022-01-01 <chr [3]>             3               0
2 2022-02-01 <chr [3]>             2               2
3 2022-03-01 <chr [4]>             4               3

相关内容

  • 没有找到相关文章

最新更新