将数据从长到宽重新格式化

liz*_*zie 4 r reshape2 tidyr

如何将此数据重新格式化为宽格式?

species val    price
setosa  5.1     3
setosa  4.9     3
setosa  4.7     3
setosa  4.6     2
Run Code Online (Sandbox Code Playgroud)

期望的输出:

species val1 val2 val3 val4 price1 price2 price3 price4
setosa  5.1  4.9  4.7  4.6    3       3      3      2
Run Code Online (Sandbox Code Playgroud)

我试过从tidyr传播,但没有成功.

Dav*_*urg 7

data.tablev 1.9.6+允许你传递多个value.vars,所以你可以简单地做

library(data.table)
dcast(setDT(df), species ~ val + price, value.var = c("val", "price"))
#    species val.1_4.6_2 val.1_4.7_3 val.1_4.9_3 val.1_5.1_3 price.1_4.6_2 price.1_4.7_3 price.1_4.9_3 price.1_5.1_3
# 1:  setosa         4.6         4.7         4.9         5.1             2             3             3             3
Run Code Online (Sandbox Code Playgroud)


fis*_*ank 5

你可以试试这个:

> d
     species val price
1     setosa 5.1     3
2     setosa 4.9     3
3     setosa 4.7     3
4     setosa 4.6     2
5 versicolor 5.1     3
6 versicolor 4.9     3
7 versicolor 4.7     3
8 versicolor 4.6     2

> t(sapply(split(d,d$species),function(x){unlist(x[,-1]) }))
           val1 val2 val3 val4 price1 price2 price3 price4
setosa      5.1  4.9  4.7  4.6      3      3      3      2
versicolor  5.1  4.9  4.7  4.6      3      3      3      2
Run Code Online (Sandbox Code Playgroud)