向R中的数据帧添加pvalue列

向R中的数据帧添加pvalue列,r,dplyr,statistics,R,Dplyr,Statistics,我有一个如下所示的数据帧: A1 A2 A3 B1 B2 B3 0 1 0 2 3 3 5 6 4 4 6 6 data %>% mutate(PValue = t.test(unlist(c(A1,A2,A3),unlist(c(B1,B2,B3)))$p.value) 我想添加一个基于t检验的专栏,以验证As和Bs之间差异的显著性: A1 A2 A3 B1 B2 B3 PValue 0 1 0 3 3 4 <some small nu

我有一个如下所示的数据帧:

A1 A2 A3 B1 B2 B3
0  1  0  2  3  3
5  6  4  4  6  6
data %>% 
    mutate(PValue = t.test(unlist(c(A1,A2,A3),unlist(c(B1,B2,B3)))$p.value)
我想添加一个基于t检验的专栏,以验证As和Bs之间差异的显著性:

A1 A2 A3 B1 B2 B3 PValue
0  1  0  3  3  4  <some small number>
5  6  4  4  6  6  <some large number>

但是,由于某些原因,生成的PValue列是常量。我将非常感谢您的帮助。

如果我们是按行操作,那么
pmap
是一种方法

library(tidyverse)
pmap_dbl(data, ~ c(...) %>% 
                   {t.test(.[1:3], .[4:6])$p.value}) %>% 
     bind_cols(data, PValue = .)
#   A1 A2 A3 B1 B2 B3      PValue
#1  0  1  0  2  3  3 0.007762603
#2  5  6  4  4  6  6 0.725030185

或者另一个选项是
rowwise
with
do

data %>%
   rowwise() %>% 
   do(data.frame(., PValue = t.test(unlist(.[1:3]), unlist(.[4:6]))$p.value))
# A tibble: 2 x 7
#     A1    A2    A3    B1    B2    B3  PValue
#* <int> <int> <int> <int> <int> <int>   <dbl>
#1     0     1     0     2     3     3 0.00776
#2     5     6     4     4     6     6 0.725  
数据
数据也使用
应用
在基数R中:

data$PValue = apply(data, 1, function(x) t.test(x[1:3], x[4:6])$p.value)
或:

结果:

  A1 A2 A3 B1 B2 B3      PValue
1  0  1  0  2  3  3 0.007762603
2  5  6  4  4  6  6 0.725030185

由于
apply
对矩阵进行内部强制,因此在数据帧上调用它是一个坏习惯,因为它有时会导致类型错误。
pmap
的一个更健壮(但更难阅读)的基本版本是
do.call(mapply,c(function(…)t.test(c(…)[1:3],c(…)[4:6])$p.value,data))
@alistaire这是一个很好的观点,但在这种情况下,我们确实知道
数据
都是数字的,因为这是
t.test
正常工作所必需的。因此,
apply
将data.frame强制转换为矩阵不是问题(至少对于这个问题是如此)。这取决于背景和你的最终目标。谢谢。你能评论一下处理大数据时的相对效率吗?@新手我会选择
pmap
,而不是
do
gather
。对于
gather
,转换为长格式的效率很低,
do
的速度也不是很快
data$PValue = apply(data, 1, function(x) t.test(x[1:3], x[4:6])$p.value)
library(dplyr)

data %>% 
  mutate(PValue = apply(., 1, function(x) t.test(x[1:3], x[4:6])$p.value))
  A1 A2 A3 B1 B2 B3      PValue
1  0  1  0  2  3  3 0.007762603
2  5  6  4  4  6  6 0.725030185