2016-10-19 14 views
0

Я пытаюсь поправиться с tidyr. Есть ли лучший способ подготовить набор данных anscombe для построения с ggplot2? В частности, я не люблю добавлять данные (obs_num). Как бы вы это сделали?tidyr :: pop_quiz: есть ли более быстрый/более прозрачный способ изменения набора данных anscombe?

library(tidyverse) 
library(datasets) 

anscombe %>% 
    mutate(obs_num = 1:n()) %>% 
    gather(variable, value, -obs_num) %>% 
    separate(variable, c("variable", "set"), 1) %>% 
    spread(variable, value) %>% 
    ggplot(aes(x = x, y = y)) + 
    geom_point() + 
    stat_smooth(method = "lm", se = FALSE, fullrange = TRUE) + 
    facet_wrap(~set) 
+2

Интересно, сколько людей проверили, действительно ли функция 'pop_quiz' является функцией в * tidyr *. Я сделал. –

ответ

0

Я думаю, вам нужно добавить дополнительный столбец для того, чтобы однозначно идентифицировать каждое наблюдение в вызове spread. Хэдли обсуждает это в комментарии по this SO question. Другой подход состоял бы в том, чтобы отдельно складывать столбцы и y, как в приведенном ниже коде, но я не понимаю, почему это было бы лучше, чем ваша версия. На самом деле, это может быть еще хуже, если есть случаи, когда x и y значения в конечном итоге из переписки:

bind_cols(anscombe %>% select(matches("x")) %>% gather(set, "x"), 
      anscombe %>% select(matches("y")) %>% gather(key, "y")) %>% 
    select(-key) %>% 
    mutate(set = gsub("x", "Set: ", set)) 

Другим вариантом было бы использовать базу reshape, которая является более емким:

anscombe %>% 
    reshape(varying=1:8, direction="long", sep="", timevar="set") 
+0

'reshape' таинственный и мощный! фантастическое однострочное решение, и я не уверен, что решение tidyverse в этом случае менее непрозрачно. –

+0

Да, я нахожу базу 'reshape' таинственной, а также. Было бы неплохо, если бы 'tidyr' мог также иметь дело с несколькими парами соответствующих столбцов. – eipi10