向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
withdo
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