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

时间:2017-10-03 12:56:50

标签: r function for-loop if-statement grepl

我目前正在尝试计算长字符串中的国家/地区的绝对数量。我已经加载了一个名为" countries"的数据框。列#34;国家",由世界上所有国家/地区组成。 我想创建一个搜索任何字符串的函数,遍历我的df中的所有国家/地区名称并返回任何country-name的出现总和。 (即所提到的国家总数)

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

2 个答案:

答案 0 :(得分:1)

您可以将答案矢量化,以缩短代码并加快功能。一个例子是:

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

答案 1 :(得分:0)

我猜你想要检查国家/地区的多个字符串,然后你可以这样做:

# 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")

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

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 a m.curr_flag = 1开始首次出现“奥地利”