for循环

时间:2018-04-16 00:47:22

标签: r for-loop if-statement

我有一个小组,代理机构,有两列如下:

> 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

我正在尝试使用完整的州名添加一个列(代理商$ 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有点新,所以这可能是一个明显的错误,但我很想念它。

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

谢谢, 杰夫

1 个答案:

答案 0 :(得分: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))