r

时间:2018-01-12 21:23:00

标签: r dplyr

我想采用长数据帧并使其更宽。这是一个例子:

df <- data.frame(date = rep(seq(as.Date("1990/1/1"), as.Date("1999/1/1"), "years"),10), price = seq.int(1, 100), type = c(rep("str",10), rep("str2",10), rep("chr",10), rep("chr2",10), rep("num",10), rep("num2",10), rep("posix",10), rep("posix2",10), rep("date",10), rep("date2",10)))

我希望每个列都是不同的日期,但正如您所看到的,每个type列都有自己的1990年到1999年的日期。我只想为每个唯一的{{1}列添加一列每个date然后一行。然后,[i,j]单元格中的条目将是该年当天的那种类型的价格。

所以我可以想象它看起来像:

  

类型,1990-1-1,1991-1-1,...,1999-1-1

     

num,1,2,...,10

     

chr,11,12,...,20

     

...

     

日期,91,92,...,100

2 个答案:

答案 0 :(得分:1)

library(dplyr)
library(tidyr)

df%>%
  arrange(date, type)%>%
  group_by(date, type)%>%
  slice(1)%>%
  spread(date, price)

# A tibble: 5 x 11
# Groups: type [5]
  type   `1990-01-01` `1991-01-01` `1992-01-01` `1993-01-01` `1994-01-01` `1995-01-01` `1996-01-01` `1997-01-01` `1998-01-01` `1999-01-01`
* <fctr>        <int>        <int>        <int>        <int>        <int>        <int>        <int>        <int>        <int>        <int>
1 chr              21           22           23           24           25           26           27           28           29           30
2 date             81           82           83           84           85           86           87           88           89           90
3 num              41           42           43           44           45           46           47           48           49           50
4 posix            61           62           63           64           65           66           67           68           69           70
5 str               1            2            3            4            5            6            7            8            9           10

现在,尼古拉斯正在每一行和每一行都制作重复文件。您必须删除它们,因为您无法在需要单个数值的位置存储向量(如Nicolas的答案中的错误所指定)。

答案 1 :(得分:0)

使用tidyr很容易:

library(tidyr)
spread(df, key = date, value = price)

     type 1990-01-01 1991-01-01 1992-01-01 1993-01-01 1994-01-01 1995-01-01 1996-01-01 1997-01-01
1     chr         21         22         23         24         25         26         27         28
2    chr2         31         32         33         34         35         36         37         38
3    date         81         82         83         84         85         86         87         88
4   date2         91         92         93         94         95         96         97         98
5     num         41         42         43         44         45         46         47         48
6    num2         51         52         53         54         55         56         57         58
7   posix         61         62         63         64         65         66         67         68