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.
3 Réponses :
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"
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)
Merci beaucoup pour votre réponse. Cela ressemble à tout ce que je veux. je vais le tester dès que possible
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
Merci pour votre réponse! je vais le tester dès que possible