如何在 R 的 substr 函数中嵌套 If 语句

How can I nest an If statement in a substr function in R

我正在尝试将数字字段分成两部分,以便与另一个数据集合并。字符数为 6 或 7 个字符长。我能够很容易地获得最后一个字符,但现在我需要该字段的前一个或两个字符,具体取决于它有多长。这是我的尝试,但我收到了一些错误。是否可以像这样嵌套 If 语句?或者我是否需要交换它和 运行 循环中具有不同赋值语句的 If 语句?

df$new_field <- as.numeric(substr(df$GEOID, 1 ,if(nchar(df$GEOID)=6){
  return(1)
}
else{
  return(2)
}))

With 可以使用 ifelse 而不是 if/else,因为 ifelse 是向量化的,而 if/else 仅采用长度为 1 和 returns 长度为 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"

注意:除了substrsubstring也可以用同样的方法

我们可以使用substring

df$new_field <- substring(df$GEOID, 1, c(1, 2)[(nchar(df$GEOID) == 7) + 1])
df$new_field
#[1] "A"  "D"  "AB"

OR 与 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)