使用 dplyr 交叉连接但只能通过前面的数字

Using dplyr to cross join but only by the number preceding

我想转这个数据框:

y<- c("1","2","2","3")
n<- c("co","ny","tn","ri")
data <- data.frame(y,n)

进入这个数据框

y <- c(1,1,2,2,3)
n <- c("co","co","ny","tn","ri")
n2 <- c("ny","tn","ri","ri",NA)

data <- data.frame(y,n,n2)

我在考虑交叉连接的思路,但我只需要按编号 n 和 n+1 进行连接。这是为了生成一个应该随时间传播信息的网络,在这种情况下,y 等于年。

这是使用 tidyverse 函数执行此操作的方法。

library(tidyverse)

data %>%
  group_by(y) %>%
  summarise(n = list(n), 
            count = n()) %>%
  mutate(n2 = lead(n),
         n2 = map2(n2, count, ~if(length(.x)) 
                   rep(.x, length.out = max(.y, length(.x))) else NA)) %>%
  unnest(c(n2, n)) %>%
  select(-count)

#   y     n     n2   
#  <chr> <chr> <chr>
#1 1     co    ny   
#2 1     co    tn   
#3 2     ny    ri   
#4 2     tn    ri   
#5 3     ri    NA   

关于与 n+1 的联接的建议是正确的,但对于所需的输出,需要 n-1。

原来的 reprex 有 y 作为一个字符,这需要是数字,所以我会在连接之外这样做,否则当 table 连接到自身时需要重复 mutate:

  data <- data %>% 
    mutate(y = as.numeric(y))

将 table 加入自身:

  data %>% 
    left_join(data %>% 
                mutate(y = y - 1), 
              by = "y")