Измените форму одного столбца на несколько столбцов в R

#r #dplyr #reshape

Вопрос:

У меня есть фрейм данных, такой как :

 Groups COL1
G1     1
G2     3
G3     5
G1     7
G2     9
G3     11
 

И я хотел бы использовать столбец Groups в качестве нескольких уникальных столбцов, таких как :

        G1 G2 G3 
  1    1  3  5
  2    7  9  8
 

У кого-нибудь есть идея, пожалуйста ?

Вот данные об игрушках, если это может помочь :

 structure(list(Groups = c("G1", "G2", "G3", "G1", "G2", "G3"), 
    Col1 = c(1L, 3L, 5L, 7L, 9L, 11L)), class = "data.frame", row.names = c(NA, 
-6L))
 

Комментарии:

1. Откуда берется COL1?

2. наши соболезнуют этому типу

3. COL2 имеет значения 1 и 7 для G1. Почему в результирующей таблице [COL2,G1] значение равно только 1? Куда уходят значения 7-12?

4. хорошо, извините за это, я обновил сообщение с правильными данными.

Ответ №1:

После ваших правок вот простое dplyr tidyr решение:

 library(tidyverse)
df %>% 
  pivot_wider(names_from = Groups,
              values_from = Col1,
              values_fn = list) %>% 
  unnest(cols = c(G1,G2,G3))
 

Выход:

      G1    G2    G3
  <int> <int> <int>
1     1     3     5
2     7     9    11
 

Используемые данные:

 df <- structure(list(Groups = c("G1", "G2", "G3", "G1", "G2", "G3"), 
    Col1 = c(1L, 3L, 5L, 7L, 9L, 11L)), class = "data.frame", row.names = c(NA, 
-6L))
 

Ответ №2:

Другая идея заключается в том,:

 df %>%
  group_by(Groups) %>%
  mutate(index = row_number()) %>%
  pivot_wider(names_from = "Groups", values_from = "Col1")

# A tibble: 2 x 4
  index    G1    G2    G3
  <int> <int> <int> <int>
1     1     1     3     5
2     2     7     9    11
 

Может упасть index в конце концов

Ответ №3:

Мы можем использовать unstack от base R

 unstack(df, Col1 ~ Groups)
  G1 G2 G3
1  1  3  5
2  7  9 11