我的数据看起来像这样
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()
来执行此操作,但是无法使其正常工作-我认为我可以指定type
和length
作为键,而另一个列作为值,但这似乎不可能。有没有一种整齐的方法可以做到这一点?
先谢谢您!
答案 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)