Вам не нужен цикл for для этого.Как уже упоминалось в комментариях, вы можете использовать group_by
.
library(tidyverse)
my.df.cor <- my.df %>%
group_by(var_a) %>%
nest() %>% # Stores var1 to var8 in a dataframe for each var_a
mutate(cor = map(data, cor)) # apply the function cor() to this data for each var_a
my.df.cor
# A tibble: 3 x 3
# var_a data cor
# <dbl> <list> <list>
# 1 1 <tibble [8 x 8]> <dbl [8 x 8]>
# 2 2 <tibble [8 x 8]> <dbl [8 x 8]>
# 3 3 <tibble [8 x 8]> <dbl [8 x 8]>
Вы получаете столбец с 3 столбцами, где данные хранятся от var1 до var8 для каждого var_a и соответствуют соответствующей матрице корреляции.
pull(my.df.cor, cor)
дает требуемый список соответствия.
Вы можете исправить свой цикл for с помощью
n <- 3
corlist <- list()
for (i in 1:n) {
corlist[[i]] <- my.df %>%
filter(var_a == i) %>%
select("var1", "var2", "var3", "var4", "var5", "var6", "var7", "var8") %>%
cor()
}
Проблема в вашем коде заключается в том, что канал вставляет data.frame в качестве первого аргумента в следующую строку, но вы попробуйтесделать присваивание и, таким образом, cor()
не получает аргумента.Сначала я ставлю назначение, а затем то, что я хочу назначить этой записи списка (индексируется [[i]]
, а не [i]
)
Данные
var_a <- c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3)
set.seed(42)
my.df <- data.frame(var_a = var_a,
var1 = sample(1:20, length(var_a), replace = TRUE),
var2 = sample(1:20, length(var_a), replace = TRUE),
var3 = sample(1:20, length(var_a), replace = TRUE),
var4 = sample(1:20, length(var_a), replace = TRUE),
var5 = sample(1:20, length(var_a), replace = TRUE),
var6 = sample(1:20, length(var_a), replace = TRUE),
var7 = sample(1:20, length(var_a), replace = TRUE),
var8 = sample(1:20, length(var_a), replace = TRUE))