通过tidyverse中的一列中的值进行宽格式

时间:2019-03-17 18:47:00

标签: r tidyverse

我的数据看起来像这样

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 3没有length“ B”。这很典型:每个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()来执行此操作,但是无法使其正常工作-我认为我可以指定typelength作为键,而另一个列作为值,但这似乎不可能。有没有一种整齐的方法可以做到这一点?

先谢谢您!

1 个答案:

答案 0 :(得分:2)

我们可以对'val1','val2'进行gather,将数据转换为'long'格式,unite将'key','type'列转换为单列,然后spread转换为“宽”格式

library(tidyverse)
gather(mydf, key, val, val1:val2) %>% 
   unite(key, key, type, sep=".") %>% 
   spread(key, val, fill = 0)