2017-03-05 4 views
1

ich bei der Durchführung t.tests für mehrere Kategorien in Rstudio steckte. Ich möchte die Ergebnisse des t.test jedes Produkttyps haben und die Online- und Offline-Preise vergleichen. Ich habe über 800 Produkttypen, weshalb ich es nicht für jede Produktgruppe manuell machen möchte.Führen Sie mehrere gepaarten t-Tests basierend auf Gruppen/Kategorien

Ich habe einen Datenrahmen (mehr als 2 Millionen Zeilen) Daten genannt, die wie folgt aussieht:

> Product_type Price_Online Price_Offline 
1 A   48    37 
2 B   29    22 
3 B   32    40 
4 A   38    36 
5 C   32    27 
6 C   31    35 
7 C   28    24 
8 A   47    42 
9 C   40    36 

Ideal genannt product_types das Ergebnis der t.test auf einen anderen Datenrahmen schreiben Ich möchte R:

> Product_type 
    1 A   
    2 B    
    3 C   
    4 D   
    5 E   
    6 F    
    7 G    
    8 H    
    9 I    
    800 ... 

wird:

> Product_type t   df  p-value interval mean of difference    
    1 A   
    2 B    
    3 C   
    4 D   
    5 E   
    6 F    
    7 G    
    8 H    
    9 I    
    800 ... 

Dies ist die Formel, wenn ich alle Produkttypen in diff hatte eren Datenrahmen:

t.test(Product_A$Price_Online, Product_A$Price_Offline, mu=0, alt="two.sided", paired = TRUE, conf.level = 0.99) 

Es muss einen einfacheren Weg geben, dies zu tun. Ansonsten muss ich 800+ Datenframes machen und dann den t-Test 800 mal durchführen.

Ich habe versucht, die Dinge mit Listen & lapply aber bisher funktioniert es nicht. Ich habe auch t-Test auf mehrere Spalten: https://sebastiansauer.github.io/multiple-t-tests-with-dplyr/

Aber am Ende ist er immer noch manuell einfügen männlich & weiblich (für mich über 800 Kategorien).

+0

[Dies wird es tun] (http://stats.stackexchange.com/questions/168378/applying-two-sample-t-test-comparing-multiple-groups-in-two-categories) – Sotos

Antwort

0

Eine Möglichkeit, es zu tun ist, zu verwenden by:

result <- by(data, data$Product_type, 
    function(x) t.test(x$Price_Online, x$Price_offline, mu=0, alt="two.sided", paired = TRUE, conf.level = 0.99)) 

Der einzige Nachteil ist, dass eine Liste von zurückgibt, und wenn Sie Ihre Ergebnisse in einem Datenrahmen wollen, müssen Sie es konvertieren:

df <- data.frame(t(matrix(unlist(result), nrow = 10))) 

Sie werden dann manuell die Produktart und Spaltennamen hinzufügen:

df$Product_type <- names(result) 
names(df) <- names(result$A) 
5

Die ordentlich Weg, es zu tun, ist mit dplyr und Besen:

library(dplyr) 
library(broom) 

df <- data %>% 
    group_by(Product_type) %>% 
    do(tidy(t.test(.$Price_Online, 
       .$Price_Offline, 
       mu = 0, 
       alt = "two.sided", 
       paired = TRUE, 
       conf.level = 0.99)))) 

viel besser lesbar als meine Basis r Lösung, und es Griffe für Sie die Spaltennamen!

EDIT Ein idiomatischer Weg, um es eher zu tun, als do (siehe r4ds) ist nest zu verwenden verschachtelten Datenrahmen für jeden Produkttyp zu erstellen, führen Sie einen t-Test für jeden verschachtelten Datenrahmen mit map von purrr .

library(broom) 
library(dplyr) 
library(purrr) 

t_test <- function(df, mu = 0, alt = "two.sided", paired = T, conf.level = .99) { 
    tidy(t.test(df$Price_Offline, 
       df$Price_Online, 
       mu = mu, 
       alt = alt, 
       paired = paired, 
       conf.level = conf.level)) 
} 

d <- df %>% 
    group_by(Product_type) %>% 
    nest() %>% 
    mutate(ttest = map(data, t_test)) %>% 
    unnest(ttest, .drop = T) 
+0

Vielen Dank für Ihre Antwort! Sehr hilfreich. – User100009

+0

Wenn meine Antwort Ihr Problem löst, markieren Sie es bitte als akzeptiert. Vielen Dank! – yeedle

+0

Großartig! Will do :) Danke nochmal – User100009

Verwandte Themen