2017-09-27 3 views
1

einen Datenrahmen mit zwei wiederholten Messungen von verschiedenen Variablen (dh A1, A2, B1, B2) DaWie kann ich ein "ordentliches" Ergebnis von purrr :: map2 erhalten?

library(purrr) 
library(tidyr) 
library(broom) 

set.seed(123) 

my_df = data.frame(matrix(rnorm(80), nrow=10)) 
colnames(my_df) <- c("A1_BEFORE", "A1_AFTER", "A2_BEFORE", "A2_AFTER", 
        "B1_BEFORE", "B1_AFTER", "B2_BEFORE", "B2_AFTER") 

Wie kann ich die funktionale Programmierung Prinzipien verwenden über Paare iterieren (BEFORE, AFTER) der gleichen Variablen, und erhalten eine „ordentlich "Ergebnis? Hier ist mein Versuch:

bef <- select(my_df, contains("BEFORE")) 
aft <- select(my_df, contains("AFTER")) 
result <- map2(bef, aft, t.test, paired = T) 

Die obigen Ergebnisse in mehreren verschachtelten Listen. Wie könnte ich ein "ordentliches" Ergebnis erhalten?

result <- tidy(map2(bef, aft, t.test, paired = T)) 

Ergebnis < - ordentlich (MAP2 (BEF, Achtern, t.test, gepaart = T))
Fehler in tidy.list (MAP2 (BEF, Achtern, t.test, gepaart = T)): Keine Aufräummethode für diese Liste erkannt Zusätzlich: Warnmeldung: In Sortierung (Namen (x)) == c ("d", "u", "v"): längere Objektlänge ist nicht ein Vielfaches von kürzerer Objektlänge

Antwort

1

Wir können verwenden, wie es ist list

map2(bef, aft, t.test, paired = TRUE) %>% 
      map_df(tidy) 
# estimate statistic p.value parameter conf.low conf.high  method 
#1 -0.1339963 -0.4613684 0.65548187   9 -0.7909999 0.5230073 Paired t-test 
#2 -0.7466034 -1.8820475 0.09250351   9 -1.6439954 0.1507885 Paired t-test 
#3 -0.2304015 -0.5740849 0.57997286   9 -1.1382891 0.6774860 Paired t-test 
#4 0.4860015 1.3468795 0.21095133   9 -0.3302644 1.3022674 Paired t-test 
# alternative 
#1 two.sided 
#2 two.sided 
#3 two.sided 
#4 two.sided 

Oder kompakter

map2_df(bef, aft, ~tidy(t.test(.x, .y, paired = TRUE))) 
1

Hier ist ein alternativer Ansatz, die Daten aufzuräumen, bevor der t-Test zu tun. Offensichtlich erhalten Sie das gleiche Ergebnis, aber dieser Ansatz kennzeichnet die Variable, die in der endgültigen Ausgabe getestet wird.

nur Daten- hinzugefügt

eine ID-Variable die wiederholten Messungen indizieren ändern

broom und tidyr neben dplyr

library(tidyr, dplyr, broom) 

Verwendung tidyr zur Umstrukturierung

my_tidy_df <- my_df %>% 
    mutate(id = row_number()) %>% # needs an id to group repeated measure 
    gather(var, value, -id) %>% 
    extract(var, c("var", "timepoint"), "([[:alnum:]]+)_([[:alnum:]]+)") %>% 
    spread(timepoint, value) 

erfordert, die gibt diese Struktur

id var  AFTER  BEFORE 
1 1 A1 -1.14854253 -0.9032172 
2 1 A2 2.36114529 -0.6500869 
3 1 B1 0.26204456 -0.5477532 
4 1 B2 -1.34416890 -0.4696884 
5 2 A1 0.53400345 1.2722203 

Sie können dann wie unter den t-Test für jede Variable ausgeführt:

my_tidy_df %>% 
    group_by(var) %>% 
    do(broom::tidy(t.test(.$BEFORE, .$AFTER, data=., paired=T))) 

Ergebnis:

# Groups: var [4] 
    var estimate statistic p.value parameter conf.low conf.high  method alternative 
    <chr>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <fctr>  <fctr> 
1 A1 0.16014628 0.3470400 0.7365381   9 -0.8837567 1.2040493 Paired t-test two.sided 
2 A2 -0.99798993 -1.6271640 0.1381451   9 -2.3854407 0.3894609 Paired t-test two.sided 
3 B1 0.04916586 0.1289803 0.9002097   9 -0.8131436 0.9114753 Paired t-test two.sided 
4 B2 -0.06919212 -0.1833619 0.8585784   9 -0.9228233 0.7844391 Paired t-test two.sided 
Verwandte Themen