r - 如何在 r 中的 if else 流控制中测试多个条件

标签 r for-loop if-statement

这似乎是一个非常简单的流控制结构疑问,但是我很难在 R 中找到正确的语法,我已经尝试了很多没有成功。我一定错过了一些非常明显的东西。

我想在一个包含巴西州代码的列表中循环,并返回它所在的区域。我的目标是操作一个更大的数据集,而不是一个列表,但这里是一个使用列表的 MWE:

a <- c("RO", "AC", "AM" ,"RR", "PA", "AP", "TO", "MA", "PI", "CE", "RN", "PB", "PE", "AL", "SE", "BA", "MG", "ES", "RJ", "SP")

setregion <- function(uf) {
  pb = txtProgressBar(min = 0, max = length(uf), initial = 0) 
  region_out<-list()
  for (i in length(uf)) {
    if (uf %in% c("RO"  ,"AC" ,"AM" ,"RR", "PA" , "AP" , "TO")) {
      region_out <- append(region_out,"North")
    } else if (  uf %in% c("MA","PI","CE","RN","PB","PE","AL","SE","BA")) {
      region_out <-append(region_out,"Northeast")
    } else if ( uf %in% c("MG","ES","RJ","SP")){
      region_out <- append(region_out,"Southeast")
    } else if ( uf %in% c("PR", "SC", "RS")){
      region_out <- append(region_out,"South") 
    } else if ( uf %in% c("MS","MT","GO", "DF")){
      region_out <-append(region_out,"Midwest")
    }
    setTxtProgressBar(pb,i)
  }
  return(region_out)
}

setregion(a)

在运行上面的代码时,似乎 if 循环也打破了 for 循环,它只返回“North”,这是对列表中第一个项目的响应。

我希望列表看起来像:
"North", "North", "North" ,"North", "North", "North","North", "Northeast", "Northeast",...
  • 我错过了什么?
  • 最佳答案

    普通 if-else 的问题在于它没有向量化。您需要一种矢量化方法,例如 ifelse 函数。但是,在您的情况下,由于您有很多条件,case_when 库中的 dplyr 函数可能更有意义:

    library(dplyr)
    
    setregion <- function(uf) {
        region_out <- case_when(
            uf %in% c("RO","AC","AM","RR","PA","AP","TO") ~ "North",
            uf %in% c("MA","PI","CE","RN","PB","PE","AL","SE","BA") ~ "Northeast",
            uf %in% c("MG","ES","RJ","SP") ~ "Southeast",
            uf %in% c("PR", "SC", "RS") ~ "South",
            uf %in% c("MS","MT","GO", "DF") ~ "Midwest"
        )
        return(region_out)
    }
    

    关于r - 如何在 r 中的 if else 流控制中测试多个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54767257/

    相关文章:

    r - 如何在R中使用map迭代对象以创建一系列gt表

    c - 循环问题 - 重复指令两次而不是一次

    python - 对空列表进行 for 循环实际上会花费时间/资源吗?

    将大写更改为小写,反之亦然,无需使用函数和 if 语句

    c++ - Char数据类型输入问题

    r - 在 Rcpp 中生成多元高斯分布

    r - 如何确定 R 中 DBSCAN 的距离/eps?

    c++ - 然后在 C++ 条件

    r - 动态构建 RMarkdown

    Java 错误 : Issue with for loop which should convert every content of a string array to a float array