R 中的交叉复制

Mik*_*iki 5 copy r multiple-columns dataframe

我请求一些帮助来解决以下问题。我有一个数据集组成

from   to
A      B
A      B
C      D
C      D
Run Code Online (Sandbox Code Playgroud)

我想获得以下数据集

from   to
A      B
A      C
C      A
C      D
Run Code Online (Sandbox Code Playgroud)

基本上,在 group_by(from) 之后,我想要在“to”列中的值、第一组中“from”列的最后一个值和“from”列的第一个值之间进行“交叉复制”在第二组中,以此类推。我正在使用“完整”,但它没有帮助。

Maë*_*aël 5

获取要更改的值的索引(无需分组),并将其替换为rev删除的值:

library(dplyr)
idx <- which(lag(df$from) != df$from | lead(df$from) != df$from)
df[idx, "to"] <- df$from[c(matrix(idx, nrow = 2)[2:1, ])]
Run Code Online (Sandbox Code Playgroud)

输出

  from to
1    A  B
2    A  C
3    C  A
4    C  D
Run Code Online (Sandbox Code Playgroud)


shs*_*shs 2

这是一个tidyverse解决方案:

\n
library(tidyverse) \n\ndat <- tibble(\n  from = c("A", "A", "C", "C"), \n  to = c("B", "B", "D", "D")\n)\n
Run Code Online (Sandbox Code Playgroud)\n
sol <- dat %>% \n  mutate(\n    fst = lag(from), # lag `from` for first values\n    lst = lead(from) # lead `from` for last values\n  ) %>% \n  group_by(from) %>% \n  transmute(\n    to = case_when( \n      row_number() == 1 & !is.na(fst) ~ fst, # if first element in group and lagged `from` is not NA then equals lagged `from`\n      row_number() == n() & !is.na(lst) ~ lst, # if last element in group and leaded `from` is not NA, then equals leaded `from`\n      T ~ to # else `to`\n    )\n  ) %>% \n  ungroup()\n\nsol\n#> # A tibble: 4 \xc3\x97 2\n#>   from  to   \n#>   <chr> <chr>\n#> 1 A     B    \n#> 2 A     C    \n#> 3 C     A    \n#> 4 C     D\n
Run Code Online (Sandbox Code Playgroud)\n