Решение с использованием tidyverse .Мы можем преобразовать фрейм данных в длинный формат, создать столбец списка, используя nest
, а затем использовать map
для выполнения cor.test
для каждого подмножества.После этого map_dbl
может извлечь значение P, указав имя "p.value"
.dat1
- окончательный результат.
library(tidyverse)
data(iris)
dat1 <- iris %>%
select_if(is.numeric) %>%
gather(Column, Value, -Petal.Width) %>%
group_by(Column) %>%
nest() %>%
mutate(Cor = map(data, ~cor.test(.x$Value, .x$Petal.Width, method = "spearman"))) %>%
mutate(Estimate = round(map_dbl(Cor, "estimate"), 2),
P_Value = map_dbl(Cor, "p.value"))
dat1
# # A tibble: 3 x 5
# Column data Cor Estimate P_Value
# <chr> <list> <list> <dbl> <dbl>
# 1 Sepal.Length <tibble [150 x 2]> <S3: htest> 0.83 4.19e-40
# 2 Sepal.Width <tibble [150 x 2]> <S3: htest> -0.290 3.34e- 4
# 3 Petal.Length <tibble [150 x 2]> <S3: htest> 0.94 8.16e-70
Если вам не нужны столбцы списка, вы можете использовать select
для их удаления.
dat1 %>% select(-data, -Cor)
# # A tibble: 3 x 3
# Column Estimate P_Value
# <chr> <dbl> <dbl>
# 1 Sepal.Length 0.83 4.19e-40
# 2 Sepal.Width -0.290 3.34e- 4
# 3 Petal.Length 0.94 8.16e-70
Теперь мы можем использоватьmutate
и case_when
для добавления метки для отображения значимости.
dat2 <- dat1 %>%
select(-data, -Cor) %>%
mutate(Significance = case_when(
P_Value < 0.001 ~ "*** <0,001",
P_Value < 0.01 ~ "** <0,01",
P_Value < 0.05 ~ "*<0,05",
TRUE ~ "Not Significant"
))
dat2
# # A tibble: 3 x 4
# Column Estimate P_Value Significance
# <chr> <dbl> <dbl> <chr>
# 1 Sepal.Length 0.83 4.19e-40 *** <0,001
# 2 Sepal.Width -0.290 3.34e- 4 *** <0,001
# 3 Petal.Length 0.94 8.16e-70 *** <0,001