Я думаю, что вы ищете функцию wilcox.test
(в пакете stats
).
Решение 1: Использование for loop
в одну сторону сравнить каждую строку A с соответствующей строкой B (и извлечь значение p) - создать for loop
, например:
pval = NULL
for(i in 1:nrow(A))
{
vec_a = as.numeric(A[i,2:ncol(A)])
vec_b = as.numeric(B[B$B == A$A[i],2:ncol(B)])
p <- wilcox.test(vec_a,vec_b)
pval = c(pval, p$p.value)
print(p)
}
В конце вы получите вектор pval
содержит значение для каждой строки.
pval
[1] 0.1333333 0.2188194 0.5838824 1.0000000
Решение 2. Использование tidyverse
Более элегантным решением является использование пакетов tidyverse
(в частности dplyr
и tidyr
) собрать ваш фрейм данных в один и сравнить каждое имя по группе, передав формулу в функцию wilcox.test
.
Сначала мы можем объединить ваши фреймы данных по их имени, используя функцию left_join
из dplyr
:
library(dplyr)
DF <- left_join(A,B, by = c("A"="B"))
A A1 A2 B1 B2 B3 B4
1 John 8 9 1 3 4 6
2 Dora 1 1 1 2 3 8
3 Robert 10 1 1 1 1 8
4 Jim 5 4 5 5 5 1
Затем, используя пакеты dplyr
и tidyr
, вы можете изменить форму вашего фрейм данных в более длинном формате:
library(dplyr)
library(tidyr)
DF %>% pivot_longer(., -A, names_to = "var", values_to = "values")
# A tibble: 24 x 3
A var values
<fct> <chr> <dbl>
1 John A1 8
2 John A2 9
3 John B1 1
4 John B2 3
5 John B3 4
6 John B4 6
7 Dora A1 1
8 Dora A2 1
9 Dora B1 1
10 Dora B2 2
# … with 14 more rows
Мы создадим новый столбец «группа», который будет указывать A или B в зависимости от значений в столбце var:
DF %>% pivot_longer(., -A, names_to = "var", values_to = "values") %>%
mutate(group = gsub("\\d","",var))
# A tibble: 24 x 4
A var values group
<fct> <chr> <dbl> <chr>
1 John A1 8 A
2 John A2 9 A
3 John B1 1 B
4 John B2 3 B
5 John B3 4 B
6 John B4 6 B
7 Dora A1 1 A
8 Dora A2 1 A
9 Dora B1 1 B
10 Dora B2 2 B
# … with 14 more rows
Наконец, мы можно сгруппировать по A
и суммировать данные, чтобы получить значение p функции wilcox.test
при сравнении значений в каждой группе для каждого имени:
DF %>% pivot_longer(., -A, names_to = "var", values_to = "values") %>%
mutate(group = gsub("\\d","",var)) %>%
group_by(A) %>%
summarise(Pval = wilcox.test(values~group)$p.value)
# A tibble: 4 x 2
A Pval
<fct> <dbl>
1 Dora 0.219
2 Jim 1
3 John 0.133
4 Robert 0.584
Это выглядит длиннее (особенно потому, что я объясняю каждый шаг ) но в конце вы видите, что нам нужно меньше строк, чем первое решение.
Это отвечает на ваш вопрос?