Я хочу выполнить операции со списком символов в R, как описано ниже:
Пример в Python
lt = ['LTA-Yokudo', 'LTA-Luo', 'LTA-Kawasaki']
[str(x).split('-')[1][:4].upper().ljust(4, 'J') for x in lt]
Ожидаемый результат
['YOKU', 'LUOJ', 'KAWA'] # in Python
c('YOKU', 'LUOJ', 'KAWA') # in R
Обратите внимание, что строка в списке всегда будет содержать символ "-".
Что было бы лучшим решением для этого в R?
Спасибо
Решение с использованием stringr
(и операции pipe из dplyr
).
library(dplyr)
library(stringr)
lt <- c('LTA-Yokudo', 'LTA-Luo', 'LTA-Kawasaki')
lt2 <- lt %>%
str_extract(pattern = "(?<=-)[A-Za-z]*") %>% # Extract letters after -
str_sub(start = 1, end = 4) %>% # Get four letters
str_pad(width = 4, pad = "J", side = "right") %>% # Add J at the end
str_to_upper() # To lower case
lt2
# [1] "YOKU" "LUOJ" "KAWA"
str_sub(lt, 5, 8) %>% str_pad(4, "j", side = "right") %>% str_to_upper
.
Базовый подход R:
> x <- c('LTA-Yokudo', 'LTA-Luo', 'LTA-Kawasaki')
> x1 <- toupper(substr(x,5,8))
> ifelse(nchar(x1) == 3,paste0(x1,"J"),x1)
[1] "YOKU" "LUOJ" "KAWA"
Рассмотрим следующее нецикличное решение в базе R
lt = c('LTA-Yokudo', 'LTA-Luo', 'LTA-Kawasaki')
n <- toupper(substr(lt, regexpr('-', lt)+1, regexpr('-', lt)+4))
ifelse(nchar(n)==3, paste0(n, 'J'), n)
# [1] "YOKU" "LUOJ" "KAWA"
Используя пакет stringr (внутри tidyverse), вы можете сделать что-то вроде этого.
library(tidyverse)
lt = c('LTA-Yokudo', 'LTA-Luo', 'LTA-Kawasaki')
##If you want lower case
new_1 <- str_to_lower(str_sub(str_replace(lt, "^.*-",""),start = 1, end = 4))
new_1
##If you want upper case
new_2 <- str_to_upper(str_sub(str_replace(lt, "^.*-",""),start = 1, end = 4))
new_2
-
это всегда 3 символа?