итеративный wilcox на data.frame в R - PullRequest
1 голос
/ 13 марта 2019

Я пытаюсь, или, точнее, хотел бы попытаться написать цикл в R, который выполняет итерационный тест Уилкоксона (wilcox.test), сравнивая 2 группы значений в каждой строке data.frame,и возвращая для каждой строки p-значение, которое затем помещается в фрейм данных со связанной с ним меткой строки.Структура данных выглядит следующим образом:

> tab[1:5,]
  mol     E12     E15     E22     E25     E26     E27     E38      E44     E47
1   A 7362.40 2475.93 3886.06 5825.59 6882.00 3250.05 3406.65  6416.29 7786.73
2   B 5391.42 2037.88 3330.05 4043.83 5766.20 2591.69 3603.95 14431.89 8320.70
3   C 1195.89  241.24  252.46  865.97 1970.28  899.22  346.36  1135.86 1179.31
4   D  502.64  171.41  434.29  508.22  419.34  260.13  298.14   326.70  167.07
5   E  181.63  171.41  165.30  150.47  164.09  109.19  122.76   212.74  155.60

Метки столбцов: мол, определенная молекула (около 20);E12 - E47 образцы, для которых измеряется значение каждой молекулы.Группы для сравнения: P;образцы Е12, Е25, Е26, Е27, Е44.D;образцы Е15, Е22, Е38, Е47.Вывод должен выглядеть следующим образом:

mol p-value
A   1
B   0.5556
C   0.9048
etc.    

Я пытался использовать цикл for, но я абсолютно не в состоянии управлять им в этом, для меня сложном, контексте.Любая помощь с комментариями о значении инструкций для новичка, как я, очень ценится.

1 Ответ

0 голосов
/ 13 марта 2019

apply() работает как петлитель на матрицах и массивах.В этом случае, с margin=1 он проходит по строкам.Каждая строка, временно преобразованная в вектор x, передается в function(x) wilcox.test(x[P], x[D])$p.value, в результате получается одно значение p на строку.P и D являются логическими векторами, определяющими, какие элементы в пределах x должны использоваться в каждом образце.

tab0 <- read.table(text="mol E12 E15 E22 E25 E26 E27 E38 E44 E47
   A 7362.40 2475.93 3886.06 5825.59 6882.00 3250.05 3406.65  6416.29 7786.73
   B 5391.42 2037.88 3330.05 4043.83 5766.20 2591.69 3603.95 14431.89 8320.70
   C 1195.89  241.24  252.46  865.97 1970.28  899.22  346.36  1135.86 1179.31
   D  502.64  171.41  434.29  508.22  419.34  260.13  298.14   326.70  167.07
   E  181.63  171.41  165.30  150.47  164.09  109.19  122.76   212.74  155.60",
   header=TRUE)

tab <- as.matrix(tab0[,-1])

P <- colnames(tab) %in% c("E12", "E25", "E26", "E27", "E44")
D <- colnames(tab) %in% c("E15", "E22", "E38", "E47")

pv <- apply(tab, 1, function(x) wilcox.test(x[P], x[D])$p.value)

data.frame(tab0[1], p.val=signif(pv, 4))

#   mol  p.val
# 1   A 0.5556
# 2   B 0.4127
# 3   C 0.1111
# 4   D 0.1905
# 5   E 0.9048
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...