Как я могу вложить оператор If в функцию substr в R - PullRequest
1 голос
/ 30 января 2020

Я пытаюсь разделить числовое поле c на две части, чтобы я мог объединиться с другим набором данных. Количество символов составляет 6 или 7 символов. Я смог получить последние символы достаточно легко, но теперь мне нужны либо первые один, либо два символа поля, в зависимости от того, как долго это будет. Это был мой удар, но я получил ряд ошибок. Можно ли вложить такое выражение If, как это? Или мне нужно поменять его местами и запустить оператор If в al oop с другими операторами присваивания?

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

Ответы [ 2 ]

1 голос
/ 30 января 2020

С может использовать ifelse вместо if/else, поскольку ifelse векторизовано, в то время как if/else принимает только одно значение длины 1 и возвращает длину 1

df$new_field <- with(df, as.numeric(substr(GEOID, 1, 
                             ifelse(nchar(GEOID) == 6, 1, 2))))

Или другое можно преобразовать логический вектор в число c

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 может также можно использовать с тем же методом

0 голосов
/ 30 января 2020

Мы можем использовать 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)
...