R中多行的T检验

R中多行的T检验,r,statistics,t-test,R,Statistics,T Test,我有一个包含40多列和200.000多行的表。 大概是这样的: ID GROUP-A1 GROUP-A2 GROUP A3...A20 GROUP-B1 GROUP-B2 GROUP-B3...B20 1 5 6 3 5....3 10 21 9 15 2 3 4 6 2....13 23 42 34 23 3 5

我有一个包含40多列和200.000多行的表。 大概是这样的:

ID GROUP-A1 GROUP-A2 GROUP A3...A20   GROUP-B1 GROUP-B2 GROUP-B3...B20
1  5        6        3     5....3     10       21       9          15
2  3        4        6     2....13    23       42       34         23
3  5        3        1     0....12    10       12       43         15 
4  0        0        2     5....3     10       21       23         15 
我想对a 1..20和B 1..20两组进行t检验,对每一行的每个测量值进行检验,这两组是独立的。可能的话,将结果统计数据放在每一行旁边的表中,或者放在一个单独的表中,这样我就可以轻松地选择重要的数据

我查看了一些R包,但它们大多需要重新格式化我的表,将度量值和组放入列中,在这种情况下,我需要200.000多个单独的表

有什么想法吗?

像这样的吗

apply(df,1,function(x){t.test(x[2:21],x[22:41])})
要在新列中保存测试统计数据或p值,可以执行以下操作

df$st=apply(df,1,function(x){t.test(x[2:21],x[22:41])$stat})

或者$p.value

您可以使用以下代码运行所有测试

i_group_a <- grep("GROUP.A", names(df1), ignore.case = TRUE)
i_group_b <- grep("GROUP.B", names(df1), ignore.case = TRUE)

ttest_list <- lapply(seq_along(i_group_a), function(k){
  i <- i_group_a[k]
  j <- i_group_b[k]
  t.test(df1[[i]], df1[[j]])
})

ttest_list[[1]]
#
#   Welch Two Sample t-test
#
#data:  df1[[i]] and df1[[j]]
#t = -2.8918, df = 3.7793, p-value = 0.04763
#alternative hypothesis: true difference in means is not equal to 0
#95 percent confidence interval:
# -19.826402  -0.173598
#sample estimates:
#mean of x mean of y 
#     3.25     13.25 
例如,要提取p值:

pval <- sapply(ttest_list, `[[`, 'p.value')
pval
#[1] 0.04762593 0.04449075 0.04390115 0.00192454
数据

您可以使用purrr使用tidyverse实现这一点。但是,它确实需要以不同的格式设置数据。以下是一个例子:

require(tidyverse)
set.seed(314)
模拟您的数据


df <- data.frame(ID = rep(1:5,each = 20),
                 participant = rep(rep(1:10,2),5),
                 group = rep(rep(c('A','B'),each = 10),5),
                 answer = sample(1:10,100, replace = T))

dfflat <- df %>% 
  unite(column, group,participant) %>%
  spread(column,answer)
长格式的等效文件:

dfflat %>%
  gather(participant,answer,-ID) %>%
  separate(participant,c('group','number'))

    ID group number answer
1    1     A      1      1
2    2     A      1      7
3    3     A      1      4
4    4     A      1      5
5    5     A      1      4
6    1     A     10      8
7    2     A     10      6
8    3     A     10      3
9    4     A     10      4
10   5     A     10      1
11   1     A      2      3
12   2     A      2      5
13   3     A      2      8
14   4     A      2      8
15   5     A      2      5
16   1     A      3      8
17   2     A      3      6
18   3     A      3      5
19   4     A      3      2
20   5     A      3     10
...
用t检验每ID检验假设,并提取p值

结果:

# A tibble: 5 x 4
     ID data              test        p.value
  <int> <list>            <list>        <dbl>
1     1 <tibble [20 x 3]> <S3: htest>   0.841
2     2 <tibble [20 x 3]> <S3: htest>   0.284
3     3 <tibble [20 x 3]> <S3: htest>   0.863
4     4 <tibble [20 x 3]> <S3: htest>   0.137
5     5 <tibble [20 x 3]> <S3: htest>   0.469
你能用dput格式发布数据吗?请使用dputdf的输出编辑问题。或者,如果dputheaddf的输出太大,则为20。df是数据集的名称。
dfflat %>%
  gather(participant,answer,-ID) %>%
  separate(participant,c('group','number'))

    ID group number answer
1    1     A      1      1
2    2     A      1      7
3    3     A      1      4
4    4     A      1      5
5    5     A      1      4
6    1     A     10      8
7    2     A     10      6
8    3     A     10      3
9    4     A     10      4
10   5     A     10      1
11   1     A      2      3
12   2     A      2      5
13   3     A      2      8
14   4     A      2      8
15   5     A      2      5
16   1     A      3      8
17   2     A      3      6
18   3     A      3      5
19   4     A      3      2
20   5     A      3     10
...
dfflat %>%
  gather(participant,answer,-ID) %>%
  separate(participant,c('group','number')) %>%
  group_by(ID) %>%
  nest() %>%
  mutate(test = map(data, ~ with(.x, t.test(answer[group == 'A'],answer[group == 'B']))),
         p.value = map_dbl(test,pluck,'p.value')) 

# A tibble: 5 x 4
     ID data              test        p.value
  <int> <list>            <list>        <dbl>
1     1 <tibble [20 x 3]> <S3: htest>   0.841
2     2 <tibble [20 x 3]> <S3: htest>   0.284
3     3 <tibble [20 x 3]> <S3: htest>   0.863
4     4 <tibble [20 x 3]> <S3: htest>   0.137
5     5 <tibble [20 x 3]> <S3: htest>   0.469