使用 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")
我想转这个数据框:
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")