首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R对每行运行T-test/anova,每行2组,3个样本

R对每行运行T-test/anova,每行2组,3个样本
EN

Stack Overflow用户
提问于 2018-07-06 00:47:43
回答 2查看 597关注 0票数 0

我的数据集如下所示:

代码语言:javascript
复制
df <- data.frame(compound = c("alanine ", "arginine", "asparagine", "aspartate"))
df <- matrix(rnorm(12*4), ncol = 12)
colnames(df) <- c("AC-1", "AC-2", "AC-3", "AM-1", "AM-2", "AM-3", "SC-1", "SC-2", "SC-3", "SM-1", "SM-2", "SM-3")
df <- data.frame(compound = c("alanine ", "arginine", "asparagine", "aspartate"), df)
 df
compound        AC.1        AC.2       AC.3       AM.1       AM.2            AM.3       SC.1       SC.2       SC.3         SM.1
1   alanine   1.18362683 -2.03779314 -0.7217692 -1.7569264 -0.8381042      0.06866567  0.2327702 -1.1558879  1.2077454  0.437707310
2   arginine -0.19610110  0.05361113  0.6478384 -0.1768597  0.5905398     -0.67945600 -0.2221109  1.4032349  0.2387620  0.598236199
3 asparagine  0.02540509  0.47880021 -0.1395198  0.8394257  1.9046667      0.31175358 -0.5626059  0.3596091 -1.0963363 -1.004673116
4  aspartate -1.36397906  0.91380826  2.0630076 -0.6817453 -0.2713498     -2.01074098  1.4619707 -0.7257269  0.2851122 -0.007027878

我想对列1:3作为一个列,4:6作为一个列对每一行(复合)执行t测试,并存储所有p值。基本上看看每种化合物的AC组和AM组之间是否存在差异。

我知道还有另一个话题,但是我找不到一个可行的解决方案。

PS。我的实际数据集大约有35000行(可能它需要一个不同的解决方案,而不是只有4行)

EN

回答 2

Stack Overflow用户

发布于 2018-07-06 00:59:21

选择感兴趣的列后,使用pmapt.test应用于每一行,方法是选择前3个和下3个观测值作为t.test的输入,并将提取的‘p值’作为原始数据中的另一列进行bind

代码语言:javascript
复制
library(tidyverse)
df %>% 
  select(AC.1:AM.3) %>%
  pmap_dbl(~ c(...) %>%
               {t.test(.[1:3], .[4:6])$p.value}) %>% 
  bind_cols(df, pval_AC_AM = .)

或者,在选择列之后,执行gather以转换为'long‘格式,spread,在summarise中应用t.test并与原始数据连接

代码语言:javascript
复制
df %>%
  select(compound, AC.1:AM.3) %>% 
  gather(key, val, -compound) %>% 
  separate(key, into = c('key1', 'key2')) %>%
  spread(key1, val) %>% 
  group_by(compound) %>%
  summarise(pval_AC_AM = t.test(AC, AM)$p.value) %>% 
  right_join(df)

更新

如果存在仅存在唯一值的情况,则t.test将显示错误。一种选择是运行t.test并针对这些情况获取NA。这可以使用possibly来完成

代码语言:javascript
复制
posttest <- possibly(function(x, y) t.test(x, y)$p.value, otherwise = NA)
df %>% 
  select(AC.1:AM.3) %>%
  pmap_dbl(~ c(...) %>%
               {posttest(.[1:3], .[4:6])}) %>% 
  bind_cols(df, pval_AC_AM = .)

posttest(rep(3,5), rep(1, 5))
#[1] NA
票数 1
EN

Stack Overflow用户

发布于 2022-01-08 09:32:46

如果可以使用外部库:

代码语言:javascript
复制
library(matrixTests)

row_t_welch(df[,2:4], df[,5:7])$pvalue
[1] 0.67667626 0.39501003 0.26678161 0.01237438
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51196406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档