在r中聚合和重塑数据帧
我想要一个长的数据帧,并使它宽。以下是一个例子:在r中聚合和重塑数据帧,r,dplyr,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("po
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)))
df使用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
库(dplyr)
图书馆(tidyr)
df%>%
安排(日期、类型)%>%
分组依据(日期、类型)%>%
切片(1)%>%
价差(日期、价格)
#一个tibble:5x11
#分组:类型[5]
型号“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”`
*
1 chr 21 22 24 25 26 27 28 29 30
2日期81828384858687888990
3数字41 42 43 44 46 47 48 49 50
4 posix 61 62 63 64 65 66 67 69 70
5 str 1 2 3 4 5 6 7 8 9 10
现在,Nicolas在每一行和每一列中都生成了重复项。您必须删除它们,因为您无法在需要单个数值的位置存储向量(如Nicolas答案中的错误所述)。当我运行此代码时,我得到错误error:行(21,31)、(81,91)、(41,51)、(61,71)、(1,11)、(22,32)、(82,92)、(42,52)、(62,72)、(2,12)、(23,33)的重复标识符,(83, 93), (43, 53), (63, 73), (3, 13), (24, 34), (84, 94), (44, 54), (64, 74), (4, 14), (25, 35), (85, 95), (45, 55), (65, 75), (5, 15), (26, 36), (86, 96), (46, 56), (66, 76), (6, 16), (27, 37), (87, 97), (47, 57), (67, 77), (7, 17), (28, 38), (88, 98), (48, 58), (68, 78), (8, 18), (29, 39), (89, 99), (49, 59), (69, 79), (9, 19), (30, 40), (90,100)、(50,60)、(70,80)、(10,20)
我得到了与@InfiniteFlashChess2相同的两点:(1)利差来自于“tidyr”包(而不是[另一个答案]()中错误提到的“tidyverse”)或您答案中的“dplyr”。(2)重复标识符通常意味着,如果在最后一行上运行duplicated
,并将其作为列变量,则会发现重复的值。@InfiniteFlashChess仅使用slice
获取第一个值。另一个选项可能是添加辅助ID,类似于df%>%groupby(日期,类型)%%>%mutate(ID=sequence)(n())%%>%unite(键、类型、id)%%>%spread(日期、价格)
。我会将此标记为正确,但如果您想查看我刚刚发布的另一个问题,它将相同的问题扩展到我的实际问题。
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