我正在尝试将数字字段分成两部分,以便可以与另一个数据集合并。字符数为6或7个字符长。我能够很容易地获得最后一个字符,但是现在我需要字段的前一个或两个字符,具体取决于它的长度。这是我的努力,但是我收到了很多错误。是否可以嵌套这样的If语句?还是我需要交换它并使用不同的赋值语句在循环中运行If语句?
df$new_field <- as.numeric(substr(df$GEOID, 1 ,if(nchar(df$GEOID)=6){
return(1)
}
else{
return(2)
}))
[可以使用ifelse
代替if/else
,因为ifelse
是矢量化的,而if/else
仅采用长度1的单个值并返回长度1
df$new_field <- with(df, as.numeric(substr(GEOID, 1,
ifelse(nchar(GEOID) == 6, 1, 2))))
或者另一个选择是将逻辑向量转换为数字
n <- (nchar(df$GEOID) != 6) + 1
df$new_field <- with(df, as.numeric(substr(GEOID, 1, n)))
使用可复制的示例
v1 <- c('1234567', '123456', '1234')
n <- (nchar(v1) != 6) + 1
n
#[1] 2 1 2
substr(v1, 1, n)
#[1] "12" "1" "12"
注意:除了substr
,substring
也可以用相同的方法使用
我们可以使用substring
df$new_field <- substring(df$GEOID, 1, c(1, 2)[(nchar(df$GEOID) == 7) + 1])
df$new_field
#[1] "A" "D" "AB"
与sub
和正则表达式进行“或”运算。
with(df, ifelse(nchar(GEOID) == 7, sub('(..).*', '\\1', GEOID),
sub('(.).*', '\\1', GEOID)))
#[1] "A" "D" "AB"
数据
df <- data.frame(GEOID = c('ABCDEF', 'DEFABC', 'ABCDEFG'), stringsAsFactors = FALSE)