首页 > 解决方案 > 在一个字符串向量中搜索一个字符串的所有实例在另一个字符串向量中

问题描述

我在一个带有数字列和相关感知的小标题中有一些数据。我还有一个大约 450 个较短字符串的向量,我想检查每个感觉。最终我想知道与每个〜450个字符串相关联的数字条目的总和值(在根据命中数按比例分配每个句子之后 - 例如,如果其中一个句子与数值3相关联并且从 450 个字符串中有两个命中我想在他们的每个计数中添加 1.5,参见示例 1 和 2,它们都出现在第一个“句子”字符串中)

下面的示例得到了我想要的 4 个示例字符串的“final_result”,但对于 ~450 个字符串不实用。(我并不特别热衷于构建一个包含 2 + ~450 列的大表来执行此操作,所以如果这可以通过搜索匹配的单个列表返回或任何其他方式来完成,那很好。)

有人可以提出一种更具可扩展性和更合适的方法来获得相同的基本输出吗?

非常感谢。

##Tibble with some strings and associated numbers
pacman::p_load(stringi, tidyverse)
set.seed(1)
entries <- tibble("numbers" = rnorm(100),
                    "strings" = stri_rand_strings(100, 15, "[A-Za-z]"))

#Strings known to show up for example
strings_to_find <- c("NJad", "GNl", "Qaw", "bQ")

#Answers in the form of a table
answers_as_table <- entries %>% 
  mutate(String1 = str_detect(entries$strings, pattern = strings_to_find[[1]]),
         String2 = str_detect(entries$strings, pattern = strings_to_find[[2]]),
         String3 = str_detect(entries$strings, pattern = strings_to_find[[3]]),
         String4 = str_detect(entries$strings, pattern = strings_to_find[[4]]))

#Find the number of strings in each entry
answers_as_table$CountofHits <- rowSums(answers_as_table[,3:6])
#prorate accordingly
answers_as_table$proration <- answers_as_table$numbers / answers_as_table$CountofHits

#Find the sum of the prorated amount
SumString1 <- sum(answers_as_table[answers_as_table$String1,8])
SumString2 <- sum(answers_as_table[answers_as_table$String2,8])
SumString3 <- sum(answers_as_table[answers_as_table$String3,8])
SumString4 <- sum(answers_as_table[answers_as_table$String4,8])


(final_product <- tibble("strings_to_find" = strings_to_find, 
       "Sums" = c(SumString1, SumString2, SumString3, SumString4)))```

标签: rstring

解决方案


用于咯咯笑的基本 R 尝试:

g <- stack(sapply(strings_to_find, grep, x=entries$strings, simplify=FALSE))
g$numbers <- entries$numbers[g$values]
g$prorata <- ave(g$numbers, g$values, FUN=function(x) x/length(x))
out <- aggregate(prorata ~ ind, data=g, sum)
out

#   ind    prorata
#1 NJad -0.3132269
#2  GNl -0.3132269
#3  Qaw  0.1836433
#4   bQ  0.3575099

比较好:

out == final_product
#      ind prorata
#[1,] TRUE    TRUE
#[2,] TRUE    TRUE
#[3,] TRUE    TRUE
#[4,] TRUE    TRUE

推荐阅读