Comment créer plusieurs nouvelles colonnes basées sur plusieurs instructions conditionnelles?
[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))
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 df
qui contient toutes les combinaisons. C'est probablement aussi plus rapide que plusieurs ifelse
conditions. 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