我的函数和 for 循环有什么问题?

What is wrong with my function and for-loop?

我目前正在尝试计算一长串国家的绝对数量。我加载了一个名为 "countries" 的数据框,其中包含列 "Countries",其中包含世界上所有国家/地区。 我想创建一个搜索任何字符串的函数,遍历我的 df 中的所有国家/地区名称和 return 任何国家/地区名称出现次数的总和。 (即提到的国家总数)

Code:

number.of.countries <- function(str){
  # #Initialize
  countcountry <- 0

  # #loop over all countries:
  for (i in countries$Countries){

  # #Logical test:
    countries_mentioned <- grepl(i, str, perl = T, ignore.case = T)

  # #add to the count
    if (isTRUE(countries_mentioned)){
      countcountry <- countcountry + str_count(str, fixed(countries$Countries[i], ignore_case = TRUE))
    }     
  }                                                                            
  #Output
  return(countcountry)
}



###When running the function:
> number.of.countries(str)
[1] NA

您可以向量化您的答案,以缩短代码并加快函数速度。一个例子是:

library(stringr)
number.countries <- function(str,dictionary){
  return(sum(str_count(str,dictionary)))
}
number.countries("England and Ireland, oh and also Wales", c("Wales","Ireland","England"))
[1] 3

可以传递自定义字典(在您的情况下 countries$Countries

我想您有多个字符串要检查国家/地区,那么您可以这样做:

# example data
longstring <- c("The countries austria and Albania are in Europe, while Australia is not. Austria is the richest of the two European countries.",
                "In this second sentence we stress the fact that Australia is part of Australia.")
countries <- c("Austria","Albania","Australia","Azerbeyan")

使用 stringi 包中的 lapplystri_count_fixed(您可以在其中指定如何区分大小写),您可以获得每个国家/地区的计数:

library(stringi)
l <- lapply(longstring, stri_count_fixed, pattern = countries, case_insensitive = TRUE)

结果:

[[1]]
[1] 2 1 1 0

[[2]]
[1] 0 0 2 0

现在您可以使用以下方法在数据框中转换它:

countdf <- setNames(do.call(rbind.data.frame, l), countries)
countdf$total <- rowSums(countdf)

最终结果:

> countdf
  Austria Albania Australia Azerbeyan total
1       2       1         1         0     4
2       0       0         2         0     2

注意:

为了演示 case_insensitive = TRUE 的工作原理,我在 longstring 中首次出现了 "Austria",但 a .