【问题标题】:Remove duplicate sub-strings in R删除R中的重复子字符串
【发布时间】:2021-05-30 19:56:27
【问题描述】:

我有“BY”、“SN”、“SY”和“BN”的字符串序列 有多个实例,如下表所示。 我想将“SNSNSNBY”减少为“SNBY”,将“SNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNBYSN”减少为“SNBY”

   SNo Bars                                                 
    <dbl> <chr>                                                       
 1      1 SNSNSNBY                                                    
 2      2 SNBYSN                                                      
 3      3 BYSN                                                        
 4      4 SNBY                                                        
 5      5 SNBY                                                        
 6      6 SNBY                                                        
 7      7 BYBYSNSN                                                    
 8      8 SNBY                                                        
 9      9 BYSN                                                        
10     10 BYSN                                                        
11     11 BYSN                                                        
12     12 SNBY                                                        
13     13 SNBY                                                        
14     14 BNSY                                                        
15     15 SNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNBYSN
16     16 SYBN                                                        
17     17 BNSYBN                                                      
18     18 BNSYBNSYBNSNBNBNBNBN                                        
19     19 SNBYSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSN      
20     20 BYSN           

【问题讨论】:

  • 最终输出应该是字符串“BNSY”或“SNBY”或“BYSN”或“SYBN”

标签: r string duplicates tidyverse


【解决方案1】:

解决此问题的一种可能方法是每隔一个字符strsplit(),然后找到唯一序列和paste()

代码

# Add a whitespace every 2 characters and then split into substrings
tmp1 <- strsplit(gsub("(.{2})", "\\1 ", df$Bars), " ")

# Obtain the unique substrings and paste
df$Bars <- sapply(tmp1, function(x){
  paste0(unique(x), collapse = "")
})

df

#    SNo     Bars
# 1    1     SNBY
# 2    2     SNBY
# 3    3     BYSN
# 4    4     SNBY
# 5    5     SNBY
# 6    6     SNBY
# 7    7     BYSN
# 8    8     SNBY
# 9    9     BYSN
# 10  10     BYSN
# 11  11     BYSN
# 12  12     SNBY
# 13  13     SNBY
# 14  14     BNSY
# 15  15     SNBY
# 16  16     SYBN
# 17  17     BNSY
# 18  18 BYSYBNSN
# 19  19     SNBY
# 20  20     BYSN

数据

df <- read.table(text = " SNo Bars 
 1      1 SNSNSNBY                                                    
 2      2 SNBYSN                                                      
 3      3 BYSN                                                        
 4      4 SNBY                                                        
 5      5 SNBY                                                        
 6      6 SNBY                                                        
 7      7 BYBYSNSN                                                    
 8      8 SNBY                                                        
 9      9 BYSN                                                        
10     10 BYSN                                                        
11     11 BYSN                                                        
12     12 SNBY                                                        
13     13 SNBY                                                        
14     14 BNSY                                                        
15     15 SNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNBYSN
16     16 SYBN                                                        
17     17 BNSYBN                                                      
18     18 BYSYBNSNBNSNBNBNBNBN                                        
19     19 SNBYSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSN      
20     20 BYSN", header = TRUE)

【讨论】:

  • 最终输出应该是字符串“BNSY”或“SNBY”或“BYSN”或“SYBN”
  • @Shoonya 这对于条目 18 没有意义,因为您指定了 4 个不同的子字符串,并且该条目包括所有这些子字符串。请更新您的问题,为您的模拟 data.frame() 添加详尽的解释和所需的输出。
  • 编辑了数据 - 第 18 行出现了一些错误。
【解决方案2】:

一个方便的解决方案是使用 tidyverse 核心库 stringr 中的 str_replace_all() 函数:

table<- table %>%
    mutate(Bars=str_replace_all(Bars, c("SNSNSNBY"="SNBY", 
    "SNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNBYSN"="SNBY"))

【讨论】:

  • 最终输出应该是字符串“BNSY”或“SNBY”或“BYSN”或“SYBN”
【解决方案3】:

你可以使用case_when()

library(tidyverse)
df1 <- df %>% 
  mutate(V3 = case_when(V3 == "SNSNSNBY" ~ "SNBY",
                        V3 == "SNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNSNBYSN" ~ "SNBY",
                        TRUE ~ V3)
         )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2014-07-28
    相关资源
    最近更新 更多