在嵌套数据框列上使用mutate_at()生成多个未通过的列

时间:2017-08-25 08:47:55

标签: r dplyr tidyr tidyverse purrr

我正在试验dplyrtidyrpurrr。我有这样的数据:

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))

现在dplyr非常棒,因为我可以执行mutate_at()之类的操作来同时操作多个列。 e.g:

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

tidyr允许我将数据的子集嵌套在一列中作为子表:

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

并感谢purrr我可以在保留嵌套列中的原始数据的同时汇总这些子表:

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

如何使用purrrmutate_at()生成多个摘要列(在每个嵌套子表中使用不同(但不是全部)列的方式)?

在这个例子中,我想用每个列的平均值加上“second”这个词。我曾希望这会产生一个新的嵌套列,然后我可以unnest()但它不会工作

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

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

@aosmith的评论是正确和有用的另外我意识到我需要使用summarise_at()而不是mutate_at()这样:

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