Comment créer plusieurs nouvelles colonnes basées sur plusieurs instructions conditionnelles?


Brent

[Première question de la pile, soyez gentil :)]

Je crée plusieurs nouvelles colonnes dans un bloc de données basé sur plusieurs déclarations conditionnelles de colonnes existantes - toutes essentiellement de nouvelles combinaisons de colonnes.

Par exemple, s'il y a 4 colonnes (a: d), j'ai besoin de nouvelles colonnes de toutes les combinaisons (abcd, abc, abd, etc.) et d'un codage 0/1 basé sur les données de seuil dans a: d.

Exemple de données sur les jouets inclus et résultat souhaité. Cependant, il doit être évolutif: il y a 4 colonnes de base, mais j'ai besoin de toutes les combinaisons de 2, 3 et 4 colonnes et pas seulement de 3 valeurs (abc, abd, .... ab, ac, ad, ... total n = 11)

[Contexte pour le contexte: il est en fait flux de données de cytométrie à partir de cellules souches multipotentes qui peuvent se développer dans les colonies de tous les types de cellules de la lignée (multipotentes ou abcd) ou des populations de plus en plus restreintes (uniquement abc, ou abd, ab, ac, etc.)

# Toy data set
set.seed(123)
df <- tibble(a = c(sample(10:50, 10)),
             b = c(sample(10:50, 10)),
             c = c(sample(10:50, 10)),
             d = c(sample(10:50, 10)))

Le code actuel produit le résultat souhaité, cependant, cela nécessite 11 lignes de code répétitif qui est sujet aux erreurs et j'espère qu'il a une solution plus élégante:

df %>% 
  mutate(
    abcd = if_else(a > 30 & b > 20 & c > 30 & d > 30, 1, 0),
    abc = if_else(a > 30 & b > 20 & c > 30 & d <= 30, 1, 0),
    abd = if_else(a > 30 & b > 20 & c <= 30 & d > 30, 1, 0),
    acd = if_else(a > 30 & b <= 20 & c > 30 & d > 30, 1, 0),
    bcd = if_else(a <= 30 & b > 20 & c > 30 & d > 30, 1, 0))
surgir

Ce que je comprends de votre question, pour chaque ligne, il vous suffit de trouver quelles colonnes répondent aux critères définis dans vos ifelse()conditions. Cette solution vectorisée ajoutera une colonne à votre dfqui contient toutes les combinaisons. C'est probablement aussi plus rapide que plusieurs ifelseconditions. Enfin, la nouvelle colonne peut être utilisée pour la commande ou le regroupement.

# define the threshold levels for all columns
threshold = c(a=30, b=20, c=30, d=30)

# get names of columns meeting the threshold and paste names
df$combn <- apply(df, 1, function(x) {
  paste(names(x)[x > threshold], collapse = "")
})

> df
# A tibble: 10 x 5
       a     b     c     d combn
   <int> <int> <int> <int> <chr>
 1    21    49    46    49 bcd  
 2    41    28    37    46 abcd 
 3    25    36    34    36 bcd  
 4    43    31    47    40 abcd 
 5    44    13    48    10 ac   
 6    11    42    35    27 bc   
 7    28    18    29    48 d    
 8    40    11    30    17 a    
 9    46    20    19    20 a    
10    24    40    14    43 bd   

Articles connexes