使用 lag() 和 mutate() 在嵌套的 tibble 中加入当前和以前的数据帧以生成新的列表列

Join current and previous dataframes in nested tibble using lag() and mutate() to produce a new list-column

我正在尝试确定后续数据帧对中的 id 集之间的差异。数据帧源自原始数据帧,该原始数据帧由表示时间段的分组变量拆分。结果应显示与前一个时间段相比,当前时间段内出现的新 ID 的行数。

我可以使用数据帧列表来完成此操作:

library(tidyverse)
set.seed(999)

examp <- tibble(
  id = c(replicate(4, sample.int(20, 9))),
  year = rep(1:4, each = 9),
  val = runif(36)
)

examp %>% 
  split(.$year) %>%
  # note my default, I compare the first year to itself
  map2(lag(., default = .[1]), anti_join, by = "id")

$`1`
# A tibble: 0 x 3
# ... with 3 variables: id <int>, year <int>, val <dbl>

$`2`
# A tibble: 3 x 3
     id  year   val
  <int> <int> <dbl>
1     5     2 0.450
2    11     2 0.943
3     2     2 0.571

$`3`
# A tibble: 6 x 3
     id  year   val
  <int> <int> <dbl>
1    19     3 0.870
2    12     3 0.403
3     9     3 0.331
4    20     3 0.315
5    16     3 0.455
6    17     3 0.699

$`4`
# A tibble: 5 x 3
     id  year    val
  <int> <int>  <dbl>
1     4     4 0.190
2    11     4 0.0804
3     2     4 0.247
4     1     4 0.619
5    18     4 0.434

但是我无法在嵌套数据框中使用 mutate 来实现相同的工作:

examp %>%
  nest_by(year) %>%
  mutate(new = anti_join(data, lag(data), by = "id"))

# A tibble: 4 x 3
# Rowwise:  year
   year               data new$id   $val
  <int> <list<tibble[,2]>>  <int>  <dbl>
1     1            [9 x 2]      3 0.0601
2     2            [9 x 2]      1 0.495 
3     3            [9 x 2]     17 0.699 
4     4            [9 x 2]     18 0.434

在这里我不知道如何指定 default 并且输出是意外的。我希望“新”是与上述数据帧相对应的数据帧列表列,然后我可以取消嵌套。

我有兴趣了解更多关于使用嵌套数据框的信息,如果能帮助我理解如何让它工作,我将不胜感激。此外,如果这个一般问题有另一种(简单的)解决方案,我很乐意了解它。

它应该包裹在 list

library(dplyr)
out <- examp %>% 
    nest_by(year) %>% 
    ungroup %>%
     mutate(newdat = lag(data, default = data[1])) %>% 
     rowwise %>%
     mutate(new = list(anti_join(data, newdat, by = 'id')))

-输出

 out$new
[[1]]
# A tibble: 0 x 2
# … with 2 variables: id <int>, val <dbl>

[[2]]
# A tibble: 3 x 2
     id   val
  <int> <dbl>
1     5 0.450
2    11 0.943
3     2 0.571

[[3]]
# A tibble: 6 x 2
     id   val
  <int> <dbl>
1    19 0.870
2    12 0.403
3     9 0.331
4    20 0.315
5    16 0.455
6    17 0.699

[[4]]
# A tibble: 5 x 2
     id    val
  <int>  <dbl>
1     4 0.190 
2    11 0.0804
3     2 0.247 
4     1 0.619 
5    18 0.434