如何在 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"
注意:除了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"
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)
我正在尝试将数字字段分成两部分,以便与另一个数据集合并。字符数为 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"
注意:除了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"
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)