R - 从管道操作员处运行t检验

jmi*_*738 5 r piping dplyr

是否有可能t.testpiping运营商运营?
我试图找到答案,但围绕这个主题的大多数问题都是针对同一数据集进行多次测试.
我看了一个broom包,但看起来好像阅读结果.
我感兴趣的是是否可以只使用piping并运行t.test()输出.
例如,这是一些示例数据

library(dplyr)
d <- data.frame(
  group = sample(LETTERS[1:2], size = 10, replace = T),
  amount = sample(1:3, size = 10, replace = T)
  )
Run Code Online (Sandbox Code Playgroud)

如果我运行t.test使用base R,我得到结果:

t.test(d$amount~d$group, var.equal = T)
> d
   group amount
1      A      2
2      A      2
3      B      1
4      B      3
5      A      2
6      B      1
7      B      2
8      A      1
9      B      3
10     A      3
Run Code Online (Sandbox Code Playgroud)

但如果我尝试使用piping,我会收到错误:

d %>% t.test(amount~group, var.equal = T)

Error: is.atomic(x) is not TRUE
In addition: Warning messages:
1: In is.na(y) :
  is.na() applied to non-(list or vector) of type 'language'
2: In mean.default(x) : argument is not numeric or logical: returning NA
3: In var(x) : NAs introduced by coercion
4: In mean.default(y) : argument is not numeric or logical: returning NA
Run Code Online (Sandbox Code Playgroud)

我需要做一些额外的操作吗?

akr*_*run 12

我们可以在里面把它summarise作为一个list

d %>%
  summarise(ttest = list(t.test(amount ~ group, var.equal = TRUE))) 
Run Code Online (Sandbox Code Playgroud)

如果我们只需要提取p值,就可以完成

d %>% 
  summarise(pval = t.test(amount ~ group, var.equal = TRUE)$p.value)
Run Code Online (Sandbox Code Playgroud)

或者我们可以把它放在里面{},然后做t.test

d %>%
     {t.test(.$amount ~ .$group, var.equal = TRUE)}
Run Code Online (Sandbox Code Playgroud)

或者通过指定data公式方法而没有大括号

d %>%
     t.test(amount ~ group, data = ., var.equal = TRUE)
Run Code Online (Sandbox Code Playgroud)

编辑:根据@ hpesoj626的评论

  • 太好了,我错过了`data = .` 参数。 (3认同)