1
votes

Ajouter le nombre d'occurrences pour chaque élément d'un vecteur de caractères

En supposant que nous ayons

df$sig <- factor(df$sig, levels=sig.fac)

comment quelqu'un pourrait-il obtenir les deux suivants?

sig.size <- c("In neither (n = 2)", "In neither (n = 2)", "In both (n = 1)"
          "T1 vs Ta (n = 3)", "T1 vs Ta (n = 3)", "T1 vs Ta (n = 3)",  
          "T2 vs T1 (n = 4)", "T2 vs T1 (n = 4)", "T2 vs T1 (n = 4)",  "T2 vs T1 (n = 4)")

sig.fac <- c("T1 vs Ta (n = 3)", "T2 vs T1 (n = 4)", "In both (n = 1)", "In neither (n = 2)")

Ceci est un extrait des données, puisque le vector sig contient plus de 10 000 éléments. J'ai essayé en utilisant table (sig) et une double boucle for en combinaison avec gsub et paste0 mais n'a pas pu obtenir quoi que ce soit. Le truc c'est que j'aimerais passer cette automatisation dans une fonction qui génère des nuages ​​de points. Pour des raisons de cohérence, j'ai besoin de sig.fac pour avoir cet ordre spécifique, afin de définir les niveaux de facteurs avant de faire le ggplot. par exemple. avec:

sig <- c("In neither", "In neither", "In both", 
         "T1 vs Ta", "T1 vs Ta",   "T1 vs Ta",  
         "T2 vs T1", "T2 vs T1", "T2 vs T1",  "T2 vs T1")

Merci d'avance pour la solution.


0 commentaires

3 Réponses :


1
votes
sig.tbl <- sig.tbl[match(names(sig.tbl), c("T1 vs Ta", "T2 vs T1", "In both", "In neither"))]
sprintf("%s (n = %s)", names(sig.tbl), sig.tbl)
# [1] "T1 vs Ta (n = 3)"   "T2 vs T1 (n = 4)"   "In both (n = 1)"    "In neither (n = 2)"

0 commentaires

1
votes

Alternativement, en utilisant une approche ordonnée

library(tibble)
library(dplyr)
library(glue)
df = tibble(sig = sig) %>% count(sig) %>% mutate(var = glue('{sig} (n = {n})'))
 unique(df$var)

[1] "In both (n = 1)"    "In neither (n = 2)" "T1 vs Ta (n = 3)"   "T2 vs T1 (n = 4)" 


0 commentaires

1
votes

Nous pourrions utiliser coller pour ce problème

sig <- c("In neither", "In neither", "In both", 
         "T1 vs Ta", "T1 vs Ta",   "T1 vs Ta",  
         "T2 vs T1", "T2 vs T1", "T2 vs T1",  "T2 vs T1")
sig.tbl <- table(sig)

Ou empiler la table en deux colonnes ensemble de données et coller

with(stack(sig.tbl), paste0(ind, " (n = ", values, ")"))

data

paste0(names(sig.tbl), " (n= ", sig.tbl, ")")
#[1] "In both (n= 1)"    "In neither (n= 2)" "T1 vs Ta (n= 3)" 
#[4] "T2 vs T1 (n= 4)"


0 commentaires