在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