Переход к широкому формату по значениям в одном столбце в Tidyverse - PullRequest
1 голос
/ 17 марта 2019

Мои данные выглядят так

mydf = data.frame(length=c(1,1,2,2,3), 
                  type=c("A","B","A","B","A"), 
                  val1=1:5, 
                  val2=6:10)


> mydf
length type val1 val2
     1    A    1    6
     1    B    2    7
     2    A    3    8
     2    B    4    9
     3    A    5   10

В этом примере type "B" для length 3 не существует. Это типично: каждый length имеет хотя бы один type, но не всегда оба. Есть только два types.

Моя цель - перевести эти данные в «более широкую» форму на type, чтобы она выглядела следующим образом с нулями (или NA) для пропущенных значений:

  length  val1.A  val1.B  val2.A   val2.B
       1       1       2       6        7
       2       3       4       8        9
       3       5       0      10        0

Я пытался сделать это с spread(), но не могу заставить его работать - я думал, что смогу указать type и length в качестве ключа, а другие столбцы в качестве значений, но это не представляется возможным. Есть ли способ сделать это?

Заранее спасибо!

1 Ответ

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

Мы можем сделать gather для 'val1', 'val2' для преобразования данных в формат 'long', unite столбцы 'key', 'type' в один столбец, а затем spread для«широкий» формат

library(tidyverse)
gather(mydf, key, val, val1:val2) %>% 
   unite(key, key, type, sep=".") %>% 
   spread(key, val, fill = 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...