2017-03-05 38 views
1

我被困在Rstudio中的多个类别执行t.tests。我想获得每种产品类型的t.test结果,比较在线和离线价格。我有超过800种产品类型,所以这就是为什么不想为每个产品组手动完成的。基于组/类别执行多个配对t检验

我有一个数据帧(超过200万行)指定的数据,看起来像:

> 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 

理想我想R键写t.test到另一个数据帧称为product_types结果:

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

变为:

> 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 ... 

这是,如果我必须DIFF所有产品类型的公式erent dataframes:

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

必须有一个更简单的方法来做到这一点。否则,我需要制作800多个数据帧,然后执行800次t检验。

我尝试了列表& lapply,但到目前为止它不工作。我也试过t检验上多列: https://sebastiansauer.github.io/multiple-t-tests-with-dplyr/

然而,到了最后他还是手动(800个类别对我来说)将男性&女性。

+0

[这将做到这一点(http://stats.stackexchange.com/questions/168378/applying-two-sample-t-test-comparing-multiple-groups-in-two-categories) – Sotos

回答

0

一种方式做到这一点是使用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)) 

唯一的缺点是,通过返回一个列表,如果你想在一个数据帧的成绩,你必须把它转换:

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

那么你必须手动添加的产品类型和列名:

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

的这样做的整洁的方法是使用dplyr和扫帚:

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)))) 

比我的基础R解决方案更可读,它处理的列名为您服务!

EDIT 更惯用的方式做到这一点,而不是使用do(见r4ds)是使用nest为每个产品类型创建嵌套dataframes,然后使用mappurrr运行t检验每个嵌套数据帧。

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

非常感谢您的回复!很有帮助。 – User100009

+0

如果我的答案解决了您的问题,请将其标记为已接受。谢谢! – yeedle

+0

太棒了!会做:)再次感谢 – User100009