我有一个小组,代理机构,有两列如下:
> 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有点新,所以这可能是一个明显的错误,但我很想念它。
关于为什么这不符合我的期望的任何建议?
谢谢, 杰夫
答案 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))