J'ai une base de données contenant plusieurs observations du contrôle et des cohortes expérimentales avec des répétitions pour chaque sujet.
Voici un exemple de mon dataframe:
subject cohort replicate val1 val2
A control 1 10 0.1
A control 2 15 0.3
A experim 1 40 0.7
A experim 2 45 0.9
B control 1 5 0.3
B experim 1 30 0.0
C control 1 50 0.5
C experim 1 NA 1.0
J'aimerais associer chaque observation de contrôle à son observation expérimentale correspondante pour chaque valeur afin de calculer le rapport entre les paires. La sortie souhaitée ressemblerait à ceci :
subject replicate ratio_val1 ratio_val2
A 1 4 7
A 2 3 3
B 1 6 0
C 1 NA 2
Idéalement, j'aimerais voir cela implémenté avec dplyr et des tuyaux.
2 réponses
Nous pouvons utiliser data.table
en remodelant l'ensemble de données au format « large ».
library(data.table)
dcast(setDT(df1), subject+replicate~cohort, value.var = c("val1", "val2"))[,
paste0("ratio_", names(df1)[4:5]) := Map(`/`, .SD[,
grep("experim", names(.SD)), with = FALSE],
.SD [, grep("control", names(.SD)), with = FALSE])][, (3:6) := NULL][]
# subject replicate ratio_val1 ratio_val2
# 1: A 1 4 7
# 2: A 2 3 3
# 3: B 1 6 0
# 4: C 1 NA 2
Ou après avoir groupé avec 'sujet', 'répliquer', on boucle sur les colonnes 'val' et on divise les éléments correspondants de 'val' pour 'expérimenter' avec celui de 'contrôle'
setDT(df1)[, lapply(.SD[, grep("val", names(.SD)), with = FALSE],
function(x) x[cohort =="experim"]/x[cohort =="control"]) ,
by = .(subject, replicate)]
Ou nous pouvons utiliser gather/spread
à partir de tidyr
library(dplyr)
library(tidyr)
df1 %>%
gather(Var, Val, val1:val2) %>%
spread(cohort, Val) %>%
group_by(subject, replicate, Var) %>%
summarise(ratio = experim/control) %>% spread(Var, ratio)
# subject replicate val1 val2
# <chr> <int> <dbl> <dbl>
# 1 A 1 4 7
# 2 A 2 3 3
# 3 B 1 6 0
# 4 C 1 NA 2
Vous pouvez utiliser la fonction summarize_at
de dplyr
pour résumer les colonnes val1
et val2
après avoir regroupé les données par subject
et replicate
. Utilisez [cohort == ...]
pour récupérer les valeurs dans le groupe expérimental et de contrôle en conséquence pour la division :
library(dplyr)
df %>% group_by(subject, replicate) %>%
summarize_at(vars(contains('val')),
funs("ratio" = .[cohort == "experim"]/.[cohort == "control"]))
# Source: local data frame [4 x 4]
# Groups: subject [?]
#
# subject replicate val1_ratio val2_ratio
# <fctr> <int> <dbl> <dbl>
# 1 A 1 4 7
# 2 A 2 3 3
# 3 B 1 6 0
# 4 C 1 NA 2
Questions connexes
Questions liées
De nouvelles questions
r
R est un langage de programmation et un environnement logiciel libres et open source pour le calcul statistique, la bioinformatique, la visualisation et le calcul général. Veuillez fournir des exemples minimaux et reproductibles ainsi que le résultat souhaité. Utilisez dput () pour les données et spécifiez tous les packages non basiques avec des appels à library (). N'incorporez pas d'images pour les données ou le code, utilisez plutôt des blocs de code en retrait. Pour les questions relatives aux statistiques, utilisez https://stats.stackexchange.com.