2017-08-25 1 views
1

J'expérimente avec dplyr, tidyr et purrr. J'ai données comme ceci:Utilisation de mutate_at() sur une colonne de données imbriquées pour générer plusieurs colonnes non modifiées

library(tidyverse) 

set.seed(123) 
df <- data_frame(X1 = rep(LETTERS[1:4], 6), 
       X2 = sort(rep(1:6, 4)), 
       ref = sample(1:50, 24), 
       sampl1 = sample(1:50, 24), 
       var2 = sample(1:50, 24), 
       meas3 = sample(1:50, 24)) 

Maintenant dplyr est génial parce que je peux faire des choses comme mutate_at() pour manipuler plusieurs colonnes à la fois. par exemple:

df <- df %>% 
    mutate_at(vars(-one_of(c("X1", "X2", "ref"))), funs(first = . - ref)) %>% 
    mutate_at(vars(contains("first")), funs(second = . *2)) 

et tidyr me permet des sous-ensembles de nids des données sous forme de sous-tables dans une seule colonne:

df <- df %>% nest(-X1) 

et grâce à purrr je peux résumer ces sous-tables, tout en conservant les données d'origine dans la colonne imbriquée:

df %>% mutate(mean = map_dbl(data, ~ mean(.x$meas3_first_second))) 

Comment puis-je utiliser purrr et mutate_at() pour générer Colum sommaire multiples ns (prend les moyennes de colonnes différentes (mais pas toutes) dans chaque sous-table imbriquée)?

Dans cet exemple, je voudrais prendre la moyenne de chaque colonne avec le mot «second». J'ai espéré que cela pourrait produire une nouvelle colonne imbriquée que je pourrais alors unnest() mais cela ne fonctionne pas.

df %>% mutate(mean = map(data, ~ mutate_at(vars(contains("second")), 
              funs(mean_comp_exp = mean(.))))) 

Comment puis-je y parvenir?

+0

Vous avez oublié de passer l'ensemble de données comme premier argument de 'mutate_at':' ~ mutate_at (.x, vars ...) ' – aosmith

Répondre

0

Le commentaire par @aosmith était correcte et utile En plus je réalisais que je devais utiliser summarise_at() et non mutate_at() comme ceci:

df %>% 
    mutate(mean = map(data, ~ summarise_at(.x, vars(contains("second")), 
               funs(mean_comp_exp = mean(.))))) %>% 
    unnest(mean)