提问者:小点点

r:dplyr使用管道选择数据,并使用来自外部管道对象的数据进行t测试


我有一种情况,我有数据分布在两个数据帧之间,我需要先从一个数据帧中的数据子集,然后在这个子集数据和另一个数据帧中的(整个)数据之间进行t检验。

我试图使用%

library(dplyr)
a <- c("AA","AA","AA","AB","AB","AB")
b <- c(1,2,3,1,2,3)
c <- c(12,34,56,78,90,12)
cols1 <- c("SampID", "Reps", "Vals")
df1 <- data.frame(a,b,c)
colnames(df1) <- cols1
df1

  SampID Reps Vals
1     AA    1   12
2     AA    2   34
3     AA    3   56
4     AB    1   78
5     AB    2   90
6     AB    3   12

e <- c(1,2,3,4,5,6,7,8,9)
f <- c(11,22,33,44,55,66,77,88,99)
cols2 <- c("CtrlReps","CtrlVals")
df2 <- data.frame(e,f)
colnames(df2) <- cols2
df2

  CtrlReps CtrlVals
1        1       11
2        2       22
3        3       33
4        4       44
5        5       55
6        6       66
7        7       77
8        8       88
9        9       99

df1 %>%
  group_by(SampID) %>%
  t.test(Vals, df2$CtrlVals, var.equal = FALSE)

但是,这会返回一个错误:

Error in match.arg(alternative) : 
  'arg' must be NULL or a character vector

我也尝试使用do,但也会返回错误:

outputs <- df1 %>%
  group_by(SampID) %>%
  do(tpvals = t.test(Vals, df2$CtrlVals, data = ., paired = FALSE, var.equal = FALSE)) %>%
  summarise(SampID, pvals = tpvals$p.value)

Error in t.test(Vals, df2$CtrlVals, data = ., paired = FALSE, var.equal = FALSE) : 
  object 'Vals' not found

我是R的新手,我已经用尽了Google-fu,所以我不知道发生了什么。据我所知,这两个错误是不相关的,我认为,但是解决一个或另一个错误给了我一条出路。我只是不知道如何解决。我也确信解决这个问题会让我立即陷入下一个问题(这篇文章实际解决的问题)。

您的意见/指导/帮助将不胜感激!


共1个答案

匿名用户

您对do的尝试很接近,可以通过执行以下操作来修复:

outputs <- df1 %>%
    group_by(SampID) %>%
    do(tpvals = t.test(.$Vals, df2$CtrlVals, 
                       paired = FALSE, var.equal = FALSE)) %>%
    summarise(SampID, pvals = tpvals$p.value)

您需要.$Vals来获取do中的Vals列,它的工作方式与mutate不完全相同。t. testdata参数在这里也没有用,因为您没有两个变量在同一个数据框中,所以您不能将它们都放在公式中。

结果:

> outputs
# A tibble: 2 x 2
  SampID pvals
  <fct>  <dbl>
1 AA     0.253
2 AB     0.862