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”列的第一个值之间进行“交叉复制”在第二组中,以此类推。我正在使用“完整”,但它没有帮助。
获取要更改的值的索引(无需分组),并将其替换为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)
这是一个tidyverse解决方案:
library(tidyverse) \n\ndat <- tibble(\n from = c("A", "A", "C", "C"), \n to = c("B", "B", "D", "D")\n)\nRun Code Online (Sandbox Code Playgroud)\nsol <- 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\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
118 次 |
| 最近记录: |