【问题标题】:Count the frequency of strings in a dataframe R计算数据帧 R 中字符串的频率
【发布时间】:2018-03-29 09:14:20
【问题描述】:

我想计算数据框中某些字符串的频率。

strings  <- c("pi","pie","piece","pin","pinned","post")
df <- as.data.frame(strings)

然后我想计算字符串的频率:

counts <- c("pi", "in", "pie", "ie")

给我类似的东西:

string  freq
 pi       5
 in       2
 pie      2
 ie       2

我已经尝试过grepltable,但我不知道如何指定要搜索的字符串。

【问题讨论】:

    标签: r grepl


    【解决方案1】:

    您可以使用sapply() 转到counts 并将counts 中的每个项目与df 中的strings 列匹配,使用grepl() 这将返回一个logical 向量(TRUE 如果匹配,FALSE 如果不匹配)。您可以将此向量相加以获得匹配数。

    sapply(df, function(x) {
      sapply(counts, function(y) {
        sum(grepl(y, x))
      })
    })
    

    这将返回:

        strings
    pi        5
    in        2
    pie       2
    ie        2
    

    【讨论】:

    • 很高兴听到,谢谢!如果您的问题得到充分回答,您可以接受。
    【解决方案2】:
    colSums(sapply(counts, stringr::str_count, string = df$strings))
     pi  in pie  ie 
      5   2   2   2 
    

    您可以使用基础 R 中的adist

    data.frame(counts,freq=rowSums(!adist(counts,strings,partial = T)))
      counts freq
    1     pi    5
    2     in    2
    3    pie    2
    4     ie    2
    

    如果您对正则表达式感到满意,那么您可以这样做:

     a=sapply(paste0(".*(",counts,").*|.*"),sub,"\\1",strings)
     table(grep("\\w",a,value = T))
     ie  in  pi pie 
      2   2   5   2 
    

    【讨论】:

      【解决方案3】:

      qgramsstringdist 包创建的频率表

      library(stringdist)
      strings  <- c("pi","pie","piece","pin","pinned","post")
      frequency <- data.frame(t(stringdist::qgrams(freq = strings, q = 2)))
      
         freq
      pi    5
      po    1
      st    1
      ie    2
      in    2
      nn    1
      os    1
      ne    1
      ec    1
      ed    1
      ce    1
      

      【讨论】:

        【解决方案4】:

        这是我仅使用基本 R 和 tidyverse 函数的解决方案,但它可能不如人们提到的其他包那么有效。

        new_df <- data.frame('VarName'=unique(df$VarName), 'Count'=0)
        
        for (row_no in 1:nrow(new_df)) {
            new_df[row_no,'Count'] = df %>%
                filter(VarName==new_df[row_no, 'VarName']) %>%
                nrow()
        }
        

        您只需要切换 df 和 VarName。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-18
          • 2017-04-19
          • 2023-03-25
          • 2021-10-07
          • 2015-02-12
          相关资源
          最近更新 更多