在数据表中成对t.test多个组合

时间:2016-01-19 14:18:41

标签: r data.table

我有一个数据表,其中有三列:卖家,产品和价格。

示例数据:

      seller product price
  1:      A  banana    56
  2:      A   lemon    94
  3:      A  orange    84
  4:      A  banana    11
  5:      A   lemon    86
---                     
166:      C  orange   162
167:      C  banana   109
168:      C  orange    61
169:      C  banana   141
170:      C  orange    22

数据代码

require (data.table)
DT <- data.table(seller = c(rep(c("A"),60),rep(c("B"),62),rep(c("C"),48)), product = c(rep(c("banana", "lemon", "orange"), 20), rep(c("banana", "lemon"), 31), rep(c("banana", "orange"), 24)), 
             price = c(56, 94, 84, 11, 86, 103, 151, 51, 117, 71, 63, 101, 45, 147, 135, 93, 26, 164, 90, 67, 12, 34, 14, 131, 92, 145, 48, 74, 62, 57, 20, 80, 113, 46, 88, 102, 134, 98, 137, 123, 169, 133, 146, 
                       160, 58, 42, 52, 158, 170, 2, 152, 10, 130, 30, 33, 144, 73, 41, 139, 107, 163, 9, 66, 81, 79, 127, 40, 165, 106, 161, 16, 1, 112, 70, 115, 138, 76, 105, 17, 118, 114, 121, 25, 39, 15, 155, 50, 166, 
                       100, 159, 5, 19, 29, 24, 64, 149, 120, 35, 119, 53, 21, 7, 72, 132, 154, 168, 156, 38, 3, 148, 69, 44, 6, 28, 140, 77, 104, 153, 59, 142, 116, 150, 97, 31, 91, 43, 47, 27, 143, 99, 37, 54, 49, 4, 111, 
                       32, 23, 85, 167, 136, 78, 129, 83, 124, 36, 96, 110, 13, 65, 108, 8, 18, 157, 87, 82, 60, 122, 89, 125, 68, 75, 126, 128, 55, 95, 162, 109, 61, 141, 22))
  

我想在销售相同产品的所有卖家之间执行成对T.test组合

我希望显示一个输出(示例的potvalue)。

欲望输出:

seller.x  seller.y  product  p.value
       A         B   banana     0.45
       A         B    lemon     0.87
       B         C   banana     0.03
       A         C   banana     0.23
       A         C   orange     0.01

1 个答案:

答案 0 :(得分:1)

首先需要按product进行分组。然后,在您的j参数中,您需要为此seller计算product的组合,并获取p.value t.test的{​​{1}}在priceseller.x之间:

seller.y

上述数据的结果如下所示:

DT[
  , {
    sellercomb <- data.table(t(combn(unique(seller), 2)))
    names(sellercomb) <- c("seller.x", "seller.y")
    sellercomb[
      , {
        data.table(p.value = t.test(price[seller == seller.x], price[seller == seller.y])$p.value)
      }
      , by = .(seller.x, seller.y)
    ]
  }
  , by = .(product)
]