R для петли вокруг трубы - PullRequest
0 голосов
/ 15 января 2019

У меня есть набор данных, пример которого выглядит так:

var_a <- vector(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, ....)
# var1 to var8 are vectors that contain pseudorandom numbers between 1 and 20 (unlike var_a not in any particular order). 
data <- data.frame(cbind(var_a, var1, var2, var3, var4, var5, var6, var7, var8))

Я хотел бы перебрать этот набор данных, используя переменную столбца "var_a" (которая на самом деле содержит числа от 1 до 127). Для каждого числа в var_a я хотел бы вычислить матрицу корреляции 8 x 8 для чисел от «var1» до «var8» и сохранить 127 матриц корреляции в списке.

Я вычислил первую корреляционную матрицу для var_a = 1, используя нисходящую трубу:

data %>%
  filter(var_a==1) %>%
  select("var1", "var2", "var3", "var4", "var5", "var6", "var7", "var8")%>%
  cor()

Теперь для меня самая сложная задача - вычислить матрицы корреляции для var_a = 1, var_a = 2, var_a = 3, ...., var_a = 127 и сохранить эти матрицы в списке.

Моя попытка заключается в следующем, но я застрял в той части, где речь идет о циклическом просмотре и хранении матриц корреляции:

n <- 127
corlist <- list()
for (i in 1:n) {
      data %>%
       filter(var_a==i) %>%
       select("var1", "var2", "var3", "var4", "var5", "var6", "var7", "var8") %>%
       corlist[i] <- cor()
}

"Error in is.data.frame(x) : argument "x" is missing, with no default"

Нужно ли сначала определить функцию для cor (), а затем интегрировать ее в конвейер и цикл?

Помощь / литература / ссылки с благодарностью! Большое спасибо!

1 Ответ

0 голосов
/ 15 января 2019

Вам не нужен цикл 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...