一定有更好的方法来完成这个任务。我可能会选择Antonios的方法,但是我不想使用filter
,而是将不同颜色的价格分散到列表列中。不幸的是,我能想到的最好代码结果变得更长了:
diamonds %>%
group_by(cut, color) %>%
summarize(price = list(price)) %>%
spread(color, price) %>%
nest() %>%
mutate(price_avg = map_dbl(data, ~ t.test(.x$E[[1L]], .x$I[[1L]])$p.value))
在这里的想法是为相应颜色的钻石价格获得两个列表列,
I
和
E
。我们现在可以在这两列上运行t-test(但不幸的是,我们需要将它们取消列出才能正常工作)。
我主要把这个放在这里作为一个对话的开端。显然,这不是你想编写的代码,但我相信应该有一种简短、逻辑的方法来表达这个逻辑(无论是已经可能了,我正在忽视它,还是整洁的数据API需要增强)。
或者我们可以使用
t.test
的公式API:
diamonds
filter(color
nest(-cut)
mutate(price_avg = map_dbl(data, ~ t.test(price ~ color, .x)$p.value))
为了完整起见,这里也介绍一下使用 broom::tidy
进行的相同操作(它返回比 p 值更多的列):
diamonds %>%
filter(color %in% c('E', 'I')) %>%
nest(-cut) %>%
mutate(test = map(data, ~ tidy(t.test(price ~ color, .x)))) %>%
unnest(test)
这将会生成一个如下所示的表格:
cut data estimate estimate1 estimate2 statistic p.value parameter conf.low conf.high method alternative
<ord> <list> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <fct> <fct>
1 Fair <tibble [1 × 7]> -1003. 3682. 4685. -2.91 3.90e- 3 327. -1682. -324. Welch Two Sample t-test two.sided
2 Good <tibble [1 × 7]> -1655. 3424. 5079. -7.19 1.46e-12 827. -2107. -1203. Welch Two Sample t-test two.sided
3 Very Good <tibble [1 × 7]> -2041. 3215. 5256. -13.4 2.44e-39 1860. -2339. -1743. Welch Two Sample t-test two.sided
4 Premium <tibble [1 × 7]> -2407. 3539. 5946. -15.5 7.27e-52 2405. -2711. -2103. Welch Two Sample t-test two.sided
5 Ideal <tibble [1 × 7]> -1854. 2598. 4452. -17.0 7.63e-62 3081. -2069. -1640. Welch Two Sample t-test two.sided