Эквивалент всеобъемлющей операции со списком в Python для строки в R

1

Я хочу выполнить операции со списком символов в R, как описано ниже:

  1. Оставьте только то, что стоит после "-"
  2. Затем оставьте только четыре первых символа из оставшихся (завершите знаком 'J', если его длина меньше четырех)
  3. Поместите все в верхний регистр

Пример в 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?
Спасибо

  • 1
    используйте сетку и назовите свой код на Python в r;)
  • 0
    Можете ли вы предположить, что часть перед - это всегда 3 символа?
Показать ещё 1 комментарий
Теги:
string
list-comprehension

4 ответа

1
Лучший ответ

Решение с использованием 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"
  • 0
    Круто, спасибо, не знал о Стрингере!
  • 1
    Предполагая, что префикс всегда один и тот же, вы можете сделать это в однострочном str_sub(lt, 5, 8) %>% str_pad(4, "j", side = "right") %>% str_to_upper .
4

Базовый подход 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"
  • 1
    @Parfait Вот почему я спросил в комментарии выше, можем ли мы предположить, что строки всегда начинаются с "LTA-", а ОП, похоже, подразумевает, что мы можем. Но да, без этого предположения вам придется сделать что-то другое.
1

Рассмотрим следующее нецикличное решение в базе 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"
0

Используя пакет 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню