2017-10-11 5 views
0

J'essaie de trouver une corrélation de toutes les variables dans une variable de regroupement. Plus précisément, j'essaie d'utiliser purrr pour remplacer une boucle que j'ai utilisée. Mais je suis un peu coincé, en partie parce que je veux utiliser deux fonctions lors de l'application sur le vecteur d'intérêt. Par exemple:Essayer de remplacer une boucle par purrr :: map_dbl et utiliser corrr :: correlate

## load packages 
library(corrr) 
library(dplyr) 
library(purrr) 

Sans un groupe cela fonctionne très bien (ce qui est la base de ce que je voudrais faire):

iris %>% 
    select(-Species) %>% 
    correlate() %>% 
    stretch() 

Mais je me contrecarrés lorsque je tente de groupe ceci:

iris %>% 
    group_by(Species) %>% 
    correlate() %>% 
    stretch() 

Error in stats::cor(x = x, y = y, use = use, method = method) : 'x' must be numeric

donc, ma pensée est d'utiliser purrr ... semble être l'endroit exact où je l'utilise pas?

iris %>% 
    split(.$Species) %>% 
    map_dbl(~correlate) ## then how do i incorporate `stretch()` 

Error: Can't coerce element 1 from a closure to a double

Il est évident que cela est faux, mais je ne sais pas exactement comment j'appliquer map_* ici ...

C'est la boucle ce que je suis en train de remplacer ce qui ne donne la sortie correcte mais Je préfère ne pas l'utiliser - il est moins flexible que l'approche purrr:

Species <- unique(iris$Species) 
df <- c() 
for(i in seq_along(Species)){ 
    u <- iris %>% 
    filter(Species == Species[i]) %>% 
    select(-Species) %>% 
    correlate() %>% 
    stretch() %>% 
    mutate(Species = Species[i]) 

    df <- rbind(df, u) 
} 

df 

# A tibble: 48 x 4 
       x   y   r Species 
      <chr>  <chr>  <dbl> <fctr> 
1 Sepal.Length Sepal.Length  NA setosa 
2 Sepal.Length Sepal.Width 0.7425467 setosa 
3 Sepal.Length Petal.Length 0.2671758 setosa 
4 Sepal.Length Petal.Width 0.2780984 setosa 
5 Sepal.Width Sepal.Length 0.7425467 setosa 
6 Sepal.Width Sepal.Width  NA setosa 
7 Sepal.Width Petal.Length 0.1777000 setosa 
8 Sepal.Width Petal.Width 0.2327520 setosa 
9 Petal.Length Sepal.Length 0.2671758 setosa 
10 Petal.Length Sepal.Width 0.1777000 setosa 

donc, en somme, quelqu'un peut-il expliquer comment utiliser purrr quand j'ai besoin d'utiliser deux fonctions. En d'autres termes, comment remplacer la boucle ci-dessus?

Répondre

1

Vous devez syntaxe résumé plus flexible avec group_by %>% do, où dans do, vous pouvez accéder à chaque sous-groupe avec . et appliquer correlate et stretch comme une trame de données normale:

library(corrr) 
library(dplyr) 

iris %>% group_by(Species) %>% do(
    select(., -Species) %>% correlate() %>% stretch() 
) 

# A tibble: 48 x 4 
# Groups: Species [3] 
# Species   x   y   r 
# <fctr>  <chr>  <chr>  <dbl> 
# 1 setosa Sepal.Length Sepal.Length  NA 
# 2 setosa Sepal.Length Sepal.Width 0.7425467 
# 3 setosa Sepal.Length Petal.Length 0.2671758 
# 4 setosa Sepal.Length Petal.Width 0.2780984 
# 5 setosa Sepal.Width Sepal.Length 0.7425467 
# 6 setosa Sepal.Width Sepal.Width  NA 
# 7 setosa Sepal.Width Petal.Length 0.1777000 
# 8 setosa Sepal.Width Petal.Width 0.2327520 
# 9 setosa Petal.Length Sepal.Length 0.2671758 
#10 setosa Petal.Length Sepal.Width 0.1777000 
# ... with 38 more rows 

Avec purrr, vous peut imbriquer les données sous chaque groupe d'abord, puis map par-dessus:

library(purrr) 
library(tidyr) 
library(dplyr) 

iris %>% 
    group_by(Species) %>% nest() %>% 
    mutate(data = map(data, compose(stretch, correlate))) %>% 
    unnest() 

# A tibble: 48 x 4 
# Species   x   y   r 
# <fctr>  <chr>  <chr>  <dbl> 
# 1 setosa Sepal.Length Sepal.Length  NA 
# 2 setosa Sepal.Length Sepal.Width 0.7425467 
# 3 setosa Sepal.Length Petal.Length 0.2671758 
# 4 setosa Sepal.Length Petal.Width 0.2780984 
# 5 setosa Sepal.Width Sepal.Length 0.7425467 
# 6 setosa Sepal.Width Sepal.Width  NA 
# 7 setosa Sepal.Width Petal.Length 0.1777000 
# 8 setosa Sepal.Width Petal.Width 0.2327520 
# 9 setosa Petal.Length Sepal.Length 0.2671758 
#10 setosa Petal.Length Sepal.Width 0.1777000 
# ... with 38 more rows 
+0

Ok! Je vais cependant attendre un peu pour accepter cela, car je me demande s'il y a une réponse basée sur le purrr. Ou dites-vous qu'il n'est pas possible de le faire en purrr? – boshek

+0

Il y a beaucoup de façons de le faire dans 'purrr'; Je pensais que 'group_by%>% do' est déjà assez simple. Fourni une alternative avec 'purrr', voir la mise à jour. – Psidom

+0

Doublement utile! Ma compréhension était que la façon préférée de faire les choses était via map_ * plutôt que do, c'est pourquoi j'ai demandé cette approche. – boshek