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

问题描述 投票:1回答:2

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

df$new_field <- as.numeric(substr(df$GEOID, 1 ,if(nchar(df$GEOID)=6){
  return(1)
}
else{
  return(2)
}))
r if-statement substr
2个回答
1
投票

[可以使用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"

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


0
投票

我们可以使用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)
© www.soinside.com 2019 - 2024. All rights reserved.