2
votes

Retourner les deux côtés de la ficelle

J'ai besoin de préparer un certain ensemble de données pour l'analyse. Ce que j'ai est une table avec des noms de colonnes (évidemment). Les noms de colonnes sont les suivants (exemple colnames):

"X99_NORM", "X101_NORM", "X76_110_T02_09747", "X30_NORM"

(c'est un vecteur, pour ceux qui ne sont pas familiers avec R colnames () code > function)

Maintenant, ce que je veux, c'est simplement retourner les valeurs devant et après le trait de soulignement. par exemple. X99_NORM devient NORM_X99 . Notez que je ne veux cela que pour les noms de colonnes qui contiennent NORM dans leur nom.


0 commentaires

3 Réponses :


5
votes
x = c("X99_NORM", "X101_NORM", "X76_110_T02_09747", "X30_NORM")
replace(x,
        grepl("NORM", x),
        sapply(strsplit(x[grepl("NORM", x)], "_"), function(x){
            paste(rev(x), collapse = "_")
        }))
#[1] "NORM_X99"          "NORM_X101"         "X76_110_T02_09747" "NORM_X30"         

0 commentaires

5
votes

Quelques autres options de base R

1)

Utilisez sub pour changer le début et la fin - nous pouvons utiliser des groupes de capture ici.

x <- c("X99_NORM", "X101_NORM", "X76_110_T02_09747", "X30_NORM")

Résultat

idx <- grep(x = x, pattern = "NORM", fixed = TRUE)
x[idx] <- paste0("NORM_", dirname(chartr("_", "/", x[idx])))
x

2)

A approche sans regex qui pourrait être plus efficace en utilisant chartr , dirname et paste . Mais nous devons d'abord obtenir les index des colonnes contenant "NORM"

x
# [1] "NORM_X99"          "NORM_X101"         "X76_110_T02_09747" "NORM_X30"

data

x <- sub(pattern = "(^X\\d+)_(NORM$)", replacement = "\\2_\\1", x = x)


1 commentaires

Merci beaucoup pour votre réponse. Cela ressemble à tout ce que je veux. je vais le tester dès que possible



2
votes

Une solution tidyverse avec stringr:

library(tidyverse)
library(stringr)

my_data <- tibble(column = c("X99_NORM", "X101_NORM", "X76_110_T02_09747", "X30_NORM"))

my_data %>%
filter(str_detect(column, "NORM")) %>%
mutate(column_2 = paste0("NORM", "_", str_extract(column, ".+(?=_)"))) %>%
select(column_2)

# A tibble: 3 x 1
  column_2 
  <chr>    
1 NORM_X99 
2 NORM_X101
3 NORM_X30 


1 commentaires

Merci pour votre réponse! je vais le tester dès que possible