我有兴趣根据其索引元素分解来重建原始向量。例如,假设我有以下字符串向量:
v <- c( "a", "a", "b", "c", "b", "a", "c" )
采用 the question about matching all occurrences ,我们可以将这个向量分解成它的索引元素对,如下所示:
library( tidyverse )
dcomp <- set_names(letters[1:3]) %>% map( ~which(v==.x) )
# $a
# [1] 1 2 6
#
# $b
# [1] 3 5
#
# $c
# [1] 4 7
我正在寻找一种优雅的方法来反转此操作并重建原始向量 v
来自 dcomp
.使用循环的最直接的解决方案需要预先初始化结果容器,并且不能通过 %>%
与 dplyr 风格的管道很好地配合使用。 :
## BAD SOLUTION #1
u <- c()
for( i in names(dcomp) )
u[ dcomp[[i]] ] <- i
all( u == v ) ## TRUE
使用 purrr::iwalk
确实与 %>%
配合得很好管道,但它仍然需要预初始化 u
并使用经常受到批评的<<-
(否则 u
赋值在计算公式的环境之外是不可见的)。
## BAD SOLUTION #2
u <- c()
dcomp %>% iwalk( ~(u[.x] <<- .y) )
all( u == v ) ## TRUE
有没有一种方法可以使用预先指定的元素到索引的映射来“即时”构建结果,并且可以与 %>%
很好地集成?管道? dcomp
的结构只要保留映射,就允许更改。
最佳答案
怎么样
rep(names(dcomp), lengths(dcomp))[order(unlist(dcomp))]
把它变成一个函数
reconstruct <- function(x) rep(names(x), lengths(x))[order(unlist(x))]
dcomp %>% reconstruct()
关于r - 在R中反转匹配操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50358180/