Mutate 函数:对字符串进行排序并删除重复字符

Mutate function: Sort a character string and remove duplicate characters

我知道这一定很简单,以至于已经有可用的功能,也许在 stringr 中,可以做到这一点......但我没有运气找到答案。

我有一个包含一列的数据框:

> df1 <- tibble(col1=c("abac", "aacabb"))
> df1
# A tibble: 2 x 1
  col1  
  <chr> 
1 abac  
2 aacabb

并且我想创建两个新列,这样我最终会得到:

> df2
# A tibble: 2 x 3
  col1   col2   col3 
  <chr>  <chr>  <chr>
1 abac   aabc   abc  
2 aacabb aaabbc abc

其中 col2 的字符按顺序排列,col3 删除了重复的字符。任何提示将不胜感激。谢谢

我们可以使用strsplit

lst1 <- lapply(strsplit(df1$col1, ""), sort)
df1$col2 <-  sapply(lst1, function(x) paste(x, collapse=""))
df1$col3 <- sapply(lst1, function(x) paste(unique(x), collapse=""))

或使用tidyverse

library(dplyr)
library(purrr)
library(stringr)
df1 %>% 
   mutate(tmp = str_extract_all(col1, "."), 
          col2 = map_chr(tmp, ~ str_c(sort(.x), collapse="")),
          col3 = map_chr(tmp, ~ str_c(unique(sort(.x)), collapse="")), 
          tmp = NULL)

-输出

# A tibble: 2 x 3
#  col1   col2   col3 
#  <chr>  <chr>  <chr>
#1 abac   aabc   abc  
#2 aacabb aaabbc abc  

使用 tidyverse

的类似选项
library(tidyverse)
df <- tibble(col1=c("abac", "aacabb"))

df %>% 
  mutate(col2 = map_chr(str_split(col1, ""), ~str_c(str_sort(.x), collapse = "")),
         col3 = map_chr(str_split(col1, ""), ~str_c(str_sort(unique(.x)), collapse = "")))
#> # A tibble: 2 x 3
#>   col1   col2   col3 
#>   <chr>  <chr>  <chr>
#> 1 abac   aabc   abc  
#> 2 aacabb aaabbc abc

reprex package (v0.3.0)

于 2020-12-14 创建