【问题标题】:else {} statement ignored in a for loop [closed]else {} 语句在 for 循环中被忽略 [关闭]
【发布时间】:2018-04-16 00:47:22
【问题描述】:

我有一个 tibble,Agencies,有如下两列:

> head(Agencies, 10)
# A tibble: 10 x 2
   AgencyNumber    State
          <int>    <chr>
 1            1       AR
 2            2 Arkansas
 3            3    Texas
 4            4    Texas
 5            5       TX
 6            6       IL
 7            7 Illinois
 8            8 Illinois
 9            9       IL
10           10       IL

我正在尝试添加具有完整州名的列 (Agencies$STATE)。如果 Agencies$State 是缩写,则应使用 abbr2state 函数将全名保存到新列中。如果 Agencies$State 已经有了全名,它应该将 Agencies$State 的值存储到新列中。

我正在使用以下代码:

Agencies$STATE <- "NA"

for(i in 1:nrow(Agencies)) {
  if(nchar(Agencies$State[i] == 2)) {
    Agencies$STATE[i] <- abbr2state(Agencies$State[i]) 
  }
  else {
    Agencies$STATE[i] <- Agencies$State[i]
  }
}

输出是意外的。它似乎按预期评估了第一个 if 语句,但忽略了 else 语句。

> head(Agencies, 10)
# A tibble: 10 x 3
   AgencyNumber    State    STATE
          <int>    <chr>    <chr>
 1            1       AR Arkansas
 2            2 Arkansas     <NA>
 3            3    Texas     <NA>
 4            4    Texas     <NA>
 5            5       TX    Texas
 6            6       IL Illinois
 7            7 Illinois     <NA>
 8            8 Illinois     <NA>
 9            9       IL Illinois
10           10       IL Illinois

我对 R 有点陌生,所以这可能是一个明显的错误,但我错过了它。

关于为什么这不符合我的预期的任何建议?

谢谢, 杰夫

【问题讨论】:

  • 不是您问题的直接答案,但您不应该在 R 中对此类操作使用循环。也许可以尝试类似Agencies$STATE &lt;- ifelse(nchar(Agencies$State) == 2, abbr2State(Agencies$State), Agencies$State)(未经测试的代码)
  • 检查 nchar 上的括号
  • 并且您应该在问题中包含您正在使用的任何库。例如,abbr2state 函数在哪个库中?
  • nchar(Agencies$State[i] == 2) (nchar(Agencies$State[i]) == 2) 你放错了括号
  • 应该作为错字关闭。

标签: r for-loop if-statement


【解决方案1】:

您的声明nchar(Agencies$State[i] == 2) 应该是(nchar(Agencies$State[i]) == 2) 你放错括号了

你也可以使用 dplyr 来避免循环

library(dplyr)
Agencies %>% 
  mutate(state =  ifelse( stringi::stri_length(State) == 2,abbr2state(State),State))

【讨论】:

  • 谢谢,哈伦! dplyr 解决方案更好!
  • 没有理由将nchar 替换为stringi::stri_length。只需添加一个额外的依赖项...
  • 你说得对,nchar 有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 2017-04-29
相关资源
最近更新 更多