2
votes

Équivalent de l'opération de liste complète de Python sur une chaîne dans R

Je souhaite effectuer des opérations sur une liste de caractères dans R comme décrit ci-dessous:

  1. Ne conserver que ce qui se trouve après le "-"
  2. Ne gardez ensuite que les quatre premiers caractères du reste (complétez par «J» si sa longueur est inférieure à quatre)
  3. Tout mettre en majuscules

Exemple en Python

['YOKU', 'LUOJ', 'KAWA'] # in Python
c('YOKU', 'LUOJ', 'KAWA') # in R

Résultat attendu

lt = ['LTA-Yokudo', 'LTA-Luo', 'LTA-Kawasaki']
[str(x).split('-')[1][:4].upper().ljust(4, 'J') for x in lt]


3 commentaires

utilisez reticulate et appelez votre code python dans r;)


Pouvez-vous supposer que la partie avant le - comporte toujours 3 caractères?


@joran: Oui, nous pouvons supposer que le préfixe sera toujours "LTA-"


4 Réponses :


0
votes

En utilisant le package stringr (dans tidyverse), vous pouvez faire quelque chose comme ceci.

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


0 commentaires

2
votes

Une solution utilisant stringr (et l'opération pipe de magrittr).

library(magrittr)
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"


2 commentaires

En supposant que le préfixe est toujours le même, vous pouvez le faire dans la ligne unique str_sub (lt, 5, 8)%>% str_pad (4, "j", side = "right")%>% str_to_upper .


@SymbolixAU Mis à jour. Merci!



5
votes

Une approche de base 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 commentaires

@Parfait C'est pourquoi j'ai demandé dans un commentaire ci-dessus si nous pouvions supposer que les chaînes commençaient toujours par "LTA-" et que l'OP semblait impliquer que nous pouvions. Mais oui, sans cette hypothèse, vous devrez faire quelque chose de différent.



1
votes

Pensez à suivre la solution non en boucle dans la base 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 commentaires