在for循环中,else{}语句被忽略了。

3

我有一个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语言还不是很熟悉,所以可能会出现一些明显的错误,但是我还没有发现。

你有什么建议吗?为什么我的代码没有达到我预期的效果?

谢谢, Jeff


3
不是对你问题的直接回答,但是在R中你不应该使用循环来进行这种类型的操作。或许可以尝试类似于 Agencies$STATE <- ifelse(nchar(Agencies$State) == 2, abbr2State(Agencies$State), Agencies$State) 的代码(未经测试)。 - SymbolixAU
5
请检查 nchar 函数中的括号是否匹配。 - Dason
你应该在问题中包含你正在使用的任何库。例如,abbr2state 函数在哪个库中? - SymbolixAU
1
nchar(Agencies$State[i] == 2) (nchar(Agencies$State[i]) == 2) 你把括号放错了位置。 - Harlan Nelson
1
应该将其关闭,因为这是一个打字错误。 - IRTFM
谢谢。括号放错位置了,现在问题解决了。abbr2state函数来自openintro包。我应该把它包含进去的。 - Jeff Jarvis
1个回答

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的解决方案甚至更好! - Jeff Jarvis
没有理由用 stringi::stri_length 替换 nchar。这只会增加额外的依赖... - Gregor Thomas
你是正确的,nchar有效。 - Harlan Nelson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接