【问题标题】:find and compare and count matching of pattern in each column in datarame在数据框中的每一列中查找并比较和计算模式匹配
【发布时间】:2021-12-12 18:20:42
【问题描述】:

我的意见:

df <- data.frame("Foo"=c("a","c","NG-c","d","e","f"), "Bar"=c("b","b","c","d","e","f"), "Baz" = c("a","a","c","NG-c","NG-c","d")
                 "Gaz" = c("NG-c","NG-c","NG-c", "NG-a","NG-a","NG-a"))
patern <- c("a","c")   

一个问题看起来有点复杂。我尝试 find&count&compare 通过模式数据框中的每一列。例如 - 我想找到所有匹配的NG-c 并在哪一列中输出每列中NG-c 占总数的最大百分比。 我的代码:

bg <- c()
for (i in ncol(df)) {
  for (pt in length(patern)) {
    tot <- sum(str_count(df[i],patern[pt]))
    ng <- sum(str_count(df[i],paste0("NG-",patern[pt] )))
    res <- round((ng/tot*100),1)
    bg <- c(bg,res) 
                              }
    if (bg[pt] >= res) {  
      print(colnames(df[i])) 
                        }    
                      }

所以我希望看到 BazGaz 列名,但我遇到了一些麻烦。
首先我收到警告消息:

if (bg[pt] >= res) { 中的错误:需要 TRUE/FALSE 的缺失值

第二个:

警告消息:1:在 stri_count_regex(string, pattern, opts_regex = opts(pattern)) :参数不是原子向量;胁迫2:在 stri_count_regex(字符串,模式,opts_regex = opts(模式)):
参数不是原子向量;胁迫

也许有更好/更聪明的方法?

【问题讨论】:

  • 共享的数据不起作用,返回错误。我认为您缺少逗号 (,)。你能显示这个数据的预期输出吗?

标签: r dataframe function dplyr tidyverse


【解决方案1】:

不确定这是否是您正在寻找的内容以及您的问题文本与patern 向量的关系。如果要计算每列NG-c 的出现次数并计算每列NG-cs 的百分比,可以使用

library(dplyr)
library(stringr)

df %>% 
  summarise(across(everything(),
                   ~sum(str_count(.x, "NG-c"))/n()))

返回

        Foo Bar       Baz Gaz
1 0.1666667   0 0.3333333 0.5

数据

df <- structure(list(Foo = c("a", "c", "NG-c", "d", "e", "f"), Bar = c("b", 
"b", "c", "d", "e", "f"), Baz = c("a", "a", "c", "NG-c", "NG-c", 
"d"), Gaz = c("NG-c", "NG-c", "NG-c", "NG-a", "NG-a", "NG-a")), class = "data.frame", row.names = c(NA, 
-6L))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-09
    • 2022-11-04
    • 2019-12-26
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多