Тидир выкладывает значения из двух столбцов (и переименовывает столбцы) - PullRequest
1 голос
/ 04 февраля 2020

Я пытаюсь построить код из R - tidyr - видоизменять и распространять несколько столбцов , извините, если это излишне с другими постами и был бы признателен за указание на эти посты, если они там!

example <- data.frame(category = c("a", "b", "c", "a", "b", "c", "a", "b", "c"),
                      value1 = c(1,2,3,4,5,6,7,8,9),
                      value2 = c(10,20,30,40,50,60,70,80,90))

  category value1 value2
1        a      1     10
2        b      2     20
3        c      3     30
4        a      4     40
5        b      5     50
6        c      6     60
7        a      7     70
8        b      8     80
9        c      9     90

Я понимаю, как повернуть это, чтобы получить значения либо value1 или value2

example %>% 
spread(category, value1)
  value2  a  b  c
1     10  1 NA NA
2     20 NA  2 NA
3     30 NA NA  3
4     40  4 NA NA
5     50 NA  5 NA
6     60 NA NA  6
7     70  7 NA NA
8     80 NA  8 NA
9     90 NA NA  9

Но я бы например

  1. изменить имена столбцов категории, чтобы отразить значения 1 и 2, поэтому для каждой категории есть два столбца

  2. Заполните значения столбца на основе values_from = value1 или value2
a_v1  a_v2  b_v1  b_v2  c_v1  c_v2
1     10    2     20    3     30
4     40    5     50    6     60
7     70    8     80    9     90

Я понимаю, что мой желаемый результат приведет к большему количеству строк с NA как в рассылке выше, но это нормально!

Ответы [ 2 ]

3 голосов
/ 04 февраля 2020

Мы можем использовать pivot_wider после создания столбца последовательности по категории. Поскольку pivot_wider может принимать несколько value_from столбцов, передайте его как вектор, в кавычках или без кавычек

library(dplyr)
library(tidyr)
example %>% 
    group_by(category) %>%
    mutate(rn = row_number()) %>%
    ungroup %>%
   pivot_wider(names_from = category, values_from = c(value1, value2))
# A tibble: 3 x 7
#     rn value1_a value1_b value1_c value2_a value2_b value2_c
#  <int>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
#1     1        1        2        3       10       20       30
#2     2        4        5        6       40       50       60
#3     3        7        8        9       70       80       90
2 голосов
/ 04 февраля 2020
library(dplyr)
library(tidyr)
example %>% 
  pivot_wider(names_from = category,
              values_from = c(value1, value2)) %>% 
  unnest()
...