r - 在R中反转匹配操作

标签 r dplyr

我有兴趣根据其索引元素分解来重建原始向量。例如,假设我有以下字符串向量:

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/

相关文章:

r - 将 dplyr 链转换为函数

r - dplyr 在链中使用 $ 获得最终值(value),例如mtcars %>% 选择(mpg)$mpg

r - 如何在 R 中有效地重新编码多列?

r - 如何使用管道 (%>%) 运算符正确地使 vim 缩进 dplyr 代码?

css - 更改导航栏菜单的字体类型和背景颜色

r - 使用 RPostgresql 打印查询时间

r - 如何更改 geom_bar 中条形之间的间距?

r - 在数据框中将重叠范围合并为唯一的组

r - 在 R : Error extent does not overlap 中使用多边形裁剪栅格

r - 如何按 R 中的分组列求和?