Преобразование строк в столбцы с общим ключом - PullRequest
2 голосов
/ 05 мая 2020

У меня есть таблица из двух столбцов, которую я хочу распространить. Я знаю, что это очень популярный и хорошо изученный здесь topi c, однако я попробовал несколько подходов и не получил того, что хотел. Любые предложения и жалобы приветствуются.

a = data.frame(names = c(rep(LETTERS[1:5],2)),
               values = c("car", "cat", "melon", "happy", "winter",
                          "train", "cat", "apple", "sad", "summer") ) 

   names values
1      A    car
2      B    cat
3      C  melon
4      D  happy
5      E winter
6      A  train
7      B    cat
8      C  apple
9      D    sad
10     E summer

Я хотел бы, чтобы из categories были столбцы, а из values строк.

Но есть проблема с общими ключами (повторяющиеся строки 2 и 7), из-за которой невозможно использовать spread или reshape.

      A   B     C     D      E
    car cat melon happy winter
  train cat apple   sad summer

Ответы [ 2 ]

3 голосов
/ 05 мая 2020

Вот решение tidyverse с использованием pivot_wider и unnest.

library(tidyverse)

a %>%
  # change from long to wide format
  pivot_wider(names_from = names,
              values_from = values,
              #Add this line to suppress the warning of values not being uniquely identified
              values_fn = list(values = list)) %>% 
  # Unnest each list into separate rows
  unnest(cols = everything())

# A tibble: 2 x 5
#  A     B     C     D     E     
#  <chr> <chr> <chr> <chr> <chr> 
#1 car   cat   melon happy winter
#2 train cat   apple sad   summer
3 голосов
/ 05 мая 2020

Вы можете использовать split и data.frame, например:

data.frame(split(a$values, a$names))
#      A   B     C     D      E
#1   car cat melon happy winter
#2 train cat apple   sad summer

Если у вас нет одинаковой цифры values на name, вы можете использовать:

x <- split(a$values, a$names)
data.frame(lapply(x, "length<-", max(lengths(x))))
...