【问题标题】:How to count characters in a string based on their content in a vector如何根据向量中的内容对字符串中的字符进行计数
【发布时间】:2022-11-13 19:40:03
【问题描述】:

我有以下向量:

v1 <- c("R", "H", "K")  # * (asterisk sign)
v2 <- c("D", "E")       # + (plus sign)
v3 <- c("A")            # - (minus sign)

给定另一个字符串,我想计算有多少个字符属于v1v2。 例如:

x1 <- "GMRRRARRRS"
#        ***-***
# v1_count = 6
# v2_count = 0
# v3_count = 1

x2 <- "KMRDFRHRAE"
#      * *+ ***-+
# v1_count = 5
# v2_count = 2
# v3_count = 1

因此,属于向量的任何字符都将被计为单个计数。

最终输出将是一个数据框或小标题:

              R,H,K        D,E       A
GMRRRARRRS      6           0        1
KMRDFRHRAE      5           2        1

我怎样才能用 R 做到这一点?

【问题讨论】:

    标签: r regex string count


    【解决方案1】:
    library(tidyverse)
    

    小标题或数据框中的样本数据

    # A tibble: 2 x 1
      string    
      <chr>     
    1 GMRRRARRRS
    2 KMRDFRHRAE
    

    创建一个函数来提取文本信息

    get_count <- function(string) {
      v1 <- c("R", "H", "K") 
      v2 <- c("D", "E")      
      v3 <- c("A")
      
      char <- string %>%
        str_split("") %>%
        getElement(1)
      
      tibble(
        "RHK" = length(char[char %in% v1]),
        "DE" = length(char[char %in% v2]),
        "A" = length(char[char %in% v3])
      )
    }
    

    使用函数和 unnest() 改变新列 data

    df %>% 
      mutate(data = map(string, get_count)) %>% 
      unnest(everything())
    
    # A tibble: 2 x 4
      string       RHK    DE     A
      <chr>      <int> <int> <int>
    1 GMRRRARRRS     6     0     1
    2 KMRDFRHRAE     5     2     1
    

    【讨论】:

      【解决方案2】:
      library(stringr)
      library(data.table)
      
      v1 <- c('R', 'H', 'K') 
      v2 <- c('D', 'E')   
      v3 <- c('A') 
      
      x1 <- 'GMRRRARRRS'
      x2 <- 'KMRDFRHRAE'
      
      char_counts <- function(input_str) {
        vars <- c('v1', 'v2', 'v3')
        counts <- lapply(vars, function(x) { 
          (strsplit(input_str, '')[[ 1 ]] %in% get(x)) |> 
            sum()
        })
        df <- data.frame(input_str, unlist(counts) |> t())
        cn <- lapply(vars, get) |> lapply(paste0, collapse = ',') |> unlist()
        colnames(df) <- c('input', cn)
        df
      }
      results_df <- lapply(c(x1, x2), char_counts) |> 
        data.table::rbindlist(fill = TRUE) |> 
        as.data.frame()
      print(results_df)
      
             input R,H,K D,E A
      1 GMRRRARRRS     6   0 1
      2 KMRDFRHRAE     5   2 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 2021-03-20
        • 2014-09-19
        • 2022-12-16
        • 1970-01-01
        • 2016-11-07
        • 2019-07-13
        相关资源
        最近更新 更多