2017-08-11 3 views
1

J'essaie de faire une boucle, donc je peux tester plusieurs conditions: cond_A, cond_B et cond_C, chacune contre le même contrôle ('ctrl'). Chaque condition et contrôle est représenté par un triplicat. Comme résultat je voudrais obtenir un dataframe avec des noms de condition et pvalues.t-test de triplicats dans une trame de données horizontale

Voici mon entrée:

structure(list(ctrl_1 = 1L, ctrl_2 = 2L, ctrl_3 = 3L, cond_A_1 = 4L, 
    cond_A_2 = 4L, cond_A_3 = 4L, cond_B_1 = 5L, cond_B_2 = 5L, 
    cond_B_3 = 7L, cond_C_1 = 8L, cond_C_2 = 9L, cond_C_3 = 2L), .Names = c("ctrl_1", 
"ctrl_2", "ctrl_3", "cond_A_1", "cond_A_2", "cond_A_3", "cond_B_1", 
"cond_B_2", "cond_B_3", "cond_C_1", "cond_C_2", "cond_C_3"), class = "data.frame", row.names = c(NA, 
-1L)) 

et les résultats escomptés avec pValues ​​hypothétiques:

cond_A_pval cond_B_pval cond_C_pval 
0.05 0.9 0.006 

Voici mon point de départ:

pval<-apply(df,1,function(x) {t.test(x[1:3],x[4:6])$p.value}) 

Répondre

1

Effectuez les opérations suivantes:

df <- structure(list(ctrl_1 = 1L, ctrl_2 = 2L, ctrl_3 = 3L, cond_A_1 = 4L, 
       cond_A_2 = 4L, cond_A_3 = 4L, cond_B_1 = 5L, cond_B_2 = 5L, 
       cond_B_3 = 7L, cond_C_1 = 8L, cond_C_2 = 9L, cond_C_3 = 2L), 
       .Names = c("ctrl_1", "ctrl_2", "ctrl_3", 
          "cond_A_1", "cond_A_2", "cond_A_3", 
          "cond_B_1", "cond_B_2", "cond_B_3", 
          "cond_C_1", "cond_C_2", "cond_C_3"), 
       class = "data.frame", row.names = c(NA, -1L)) 

library(tidyr) 

# Reshape the data into key-value pairs. 
# It is generally advisable to have data in tidy format. 
df <- gather(df) 
# Remove the _1, _2, etc. 
df$group <- gsub("_\\d", "", df$key) 

#Now you can loop through the groups. Note that "ctrl" is the first group: 
sapply(unique(df$group)[-1], function(x){ 
    t.test(df[df$group == "ctrl", "value"], df[df$group == x, "value"])$p.value 
}) 

cond_A  cond_B  cond_C 
0.07417990 0.01477836 0.17957429 

Voir aussi Looping through t.tests for data frame subsets in r

+0

fonctionne avec des valeurs dans l'exemple, mais pas dans mes données réelles, voir ci-dessous; structure (liste (clé = c ("ctrl_1", "ctrl_2", "ctrl_3", "cond_A_1", "cond_A_2", "cond_A_3", "cond_B_1", "cond_B_2", "cond_B_3", "cond_C_1", "cond_C_2", "cond_C_3"), valeur = c ("13.382", "12.9152", "14.719", "13.3822", "12.9152", "8.788", "9.3765", "17.1525", "6.664", "11.2885", "10.5390", "37.030"), groupe = c ("ctrl", "ctrl", "ctrl", "cond_A", "cond_A", "cond_A", "cond_b", "cond_B" , "cond_B", "cond_C", "cond_C", "cond_C")), .Names = c ("clé", "valeur", "groupe" ), row.names = c (NA, -12L) , class = "data.frame") – user2904120

+0

include: df <-transform (df, valeur = as.numérique (valeur)); aidé – user2904120

+1

Cela semble être un problème des données sous-jacentes. Dans votre 'structure', les valeurs sont spécifiées en tant que caractères (chaînes). Heureux que cela fonctionne après la transformation des données en numérique. – coffeinjunky