根据组/类别执行多个配对t检验

时间:2017-03-05 14:38:56

标签: r t-test

我坚持在Rstudio中为多个类别执行t.tests。我希望得到每种产品类型的t.test的结果,比较在线和离线价格。我有800多种产品类型,因此不希望为每个产品组手动执行此操作。

我有一个数据框(超过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 ...

如果我在不同的数据框中包含所有产品类型,则这是公式:

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-Test: https://sebastiansauer.github.io/multiple-t-tests-with-dplyr/

然而,最后他仍然手动插入男性和女性。女性(对我来说超过800个类别)。

2 个答案:

答案 0 :(得分:15)

这样做的整洁方法是使用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))))

比我的基础解决方案更具可读性,它为您处理列名称!

修改 使用do而不是使用nest(请参阅r4ds)的更惯用的方法是使用map为每种产品类型创建嵌套数据框,然后为每个嵌套数据框运行t检验使用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)

var matrix = $obj.css('transform');
var translate = {};

// translateX 
var matchX = matrix.match(/translateX\((-?\d+\.?\d*px)\)/);
if(matchX) {
  translate.x = matchX[1];
}

// translateY
var matchY = matrix.match(/translateY\((-?\d+\.?\d*px)\)/);
if(matchY) {
  translate.y = matchY[1];
}

console.log(translate);

答案 1 :(得分:4)

一种方法是使用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)