我想采用长数据帧并使其更宽。这是一个例子:
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
答案 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