Изменение формы df с помощью dplyr с использованием сбора / распространения с несколькими переменными - PullRequest
1 голос
/ 14 марта 2019

Я пытаюсь изменить свой набор данных, используя функции сбора и распространения dplyr для перемещения из этой формы данных:

library(tidyverse)
# test data set
df = tibble(factor = c("a","a","b","b"),
           factor2 = c("d1","d2","d1","d2"),
           value1 = round(rnorm(4),1)*10,
           value2 = round(runif(4),2)*100)

это выглядит так:

# A tibble: 4 x 4
  factor factor2 value1 value2
  <chr>  <chr>    <dbl>  <dbl>
1 a      d1           4     97
2 a      d2         -21     10
4 b      d1          -2     65
5 b      d2         -14     93

к чему-то, что будет выглядеть так:

factor    d1val1   d1val2  d2val1  d2val2
a          4        97      -21     10
b         -2        65      -14     93

В идеале я хотел бы добиться этого с помощью dplyr spread / collect.

Ответы [ 3 ]

3 голосов
/ 14 марта 2019

Для полноты реализации реализация dcast() способна изменить несколько переменных одновременно:

library(data.table)
dcast(setDT(df), factor ~ factor2, value.var = c("value1", "value2"))
   factor value1_d1 value1_d2 value2_d1 value2_d2
1:      a         4       -21        97        10
2:      b        -2       -14        65        93
2 голосов
/ 14 марта 2019

Другая возможность tidyverse может быть:

df %>% 
 gather(var, val, -c(factor, factor2)) %>%
 mutate(var = paste0(factor2, var)) %>%
 select(-factor2) %>%
 spread(var, val) 

  factor d1value1 d1value2 d2value1 d2value2
  <chr>     <dbl>    <dbl>    <dbl>    <dbl>
1 a            -4       85       -4       65
2 b             4       39       -1       20

Она, во-первых, преобразует данные из широкоформатного формата в длинный, исключая переменные "factor" и "factor2".Во-вторых, он объединяет значения из «factor2» и имена переменных.Наконец, он удаляет избыточные переменные и возвращает данные в желаемый формат.

2 голосов
/ 14 марта 2019

Можно указать gather столбцы 'value' в формате 'long', затем unite столбец 'factor2' и 'key', чтобы создать один столбец, и spread обратно в 'wide'format

library(dplyr)
library(tidyr)
df %>% 
  gather(key, val, value1:value2) %>% 
  unite(dcols, factor2, key, sep = "") %>%
  spread(dcols, val)

Поскольку типы столбцов одинаковы, это можно сделать с gather и spread

...