首页 > 解决方案 > 行之间的 T 检验 - 匹配字符串名称

问题描述

Names与两者相比,我想执行 t 检验并提取所有的 pvalue References。这就是数据的样子:

dput(data)
structure(list(Area = c(3.62, 12.14, 13.74, 3.14, 131.86, 
                             7.14, 14.66, 15.38, 12, 13.02, 192.12, 21.54, 13.38, 55.84, 23.86, 
                             5.38, 200.56, 11.06, 12.12, 41.98, 33.32, 6.96, 210.12, 3.56), 
               Names = c("Mark", "Peter", "Greg", "Manuel", "Reference1", 
                         "Reference2", "Mark", "Peter", "Greg", "Manuel", "Reference1", 
                         "Reference2", "Mark", "Peter", "Greg", "Manuel", "Reference1", 
                         "Reference2", "Mark", "Peter", "Greg", "Manuel", "Reference1", 
                         "Reference2")), row.names = c(NA, -24L), class = "data.frame")

我想Area对每个Name(马克、彼得、格雷格、曼努埃尔)进行 4 次重复,并将其Reference1Reference2区域进行比较。怎么做 ?

标签: r

解决方案


library(data.table)
library(magrittr)
df <- setDT(df)

我会首先得到不是唯一名称的列表Reference

namelist <- grep("^(?!Reference).*$",df$Names,perl = T,value = T) %>% unique()

然后只需使用sapplyt.test函数在名称变量和引用之间进行 t.test: for Reference1

sapply(namelist,function(nom){
  t.test(df[Names == nom,Area],df[Names == "Reference1",Area])$p.value
})

        Mark        Peter         Greg       Manuel 
0.0019808894 0.0007699491 0.0016631637 0.0019262987 

对于第二个参考:

sapply(namelist,function(nom){
  t.test(df[Names == nom,Area],df[Names == "Reference2",Area])$p.value
})

     Mark     Peter      Greg    Manuel 
0.9802556 0.1460768 0.1690645 0.4439897 

我使用 data.table 只是为了简单地设置 data.table 的子集,但可以使用任何你喜欢的东西。在基础 R 中,你会做df$Area[df$Names == nom]而不是df[Names == nom,Area]


推荐阅读