0

我想通过ID将一个长且按时间顺序排列的数据集转换为一个宽但按时间顺序排列的数据集让我们看一个例子:

ID 产品 日期
1 自行车 2000 年 1 月 1 日
1 2000 年 2 月 1 日
2 2000 年 15 月 2 日
2 座位 2000 年 17 月 2 日
1 计时器 20/2/2000

进入下表:

ID 第一 第二 第三 ETC
1 自行车 计时器
2 座位

不得更改所购买产品的顺序。

你们能帮帮我吗?

非常感谢!

4

3 回答 3

1

我们可以dcast使用data.table

library(data.table)
dcast(setDT(df), ID ~ rowid(ID), value.var = c('Product', 'Date'))
#     ID Product_1 Product_2   Product_3    Date_1    Date_2    Date_3
#1:  1      Bike      Tire Chronometer  1/1/2000  2/1/2000 20/2/2000
#2:  2       Car      Seat        <NA> 15/2/2000 17/2/2000      <NA>

数据

df <- structure(list(ID = c(1L, 1L, 2L, 2L, 1L), Product = c("Bike", 
"Tire", "Car", "Seat", "Chronometer"), Date = c("1/1/2000", "2/1/2000",
"15/2/2000", "17/2/2000", "20/2/2000")), class = "data.frame",
row.names = c(NA,
-5L))
于 2021-03-02T16:00:59.647 回答
1

arrangeID每个and的数据,为每个Date提供一个唯一的行号,ID并将数据转换为宽格式。

library(dplyr)

df %>%
  mutate(Date = as.Date(Date, '%d/%m/%Y')) %>%
  arrange(ID, Date) %>%
  group_by(ID) %>%
  mutate(row = row_number()) %>%
  tidyr::pivot_wider(names_from = row, values_from = c(Product, Date))

#     ID Product_1 Product_2 Product_3   Date_1     Date_2     Date_3    
#  <int> <chr>     <chr>     <chr>       <date>     <date>     <date>    
#1     1 Bike      Tire      Chronometer 2000-01-01 2000-01-02 2000-02-20
#2     2 Car       Seat      NA          2000-02-15 2000-02-17 NA        

数据

df <- structure(list(ID = c(1L, 1L, 2L, 2L, 1L), Product = c("Bike", 
"Tire", "Car", "Seat", "Chronometer"), Date = c("1/1/2000", "2/1/2000", 
"15/2/2000", "17/2/2000", "20/2/2000")), class = "data.frame", row.names = c(NA, -5L))
于 2021-03-02T15:11:05.050 回答
1

使用基本 R 选项reshape

reshape(
  transform(
    df,
    q = ave(1:nrow(df), ID, FUN = seq_along)
  ),
  direction = "wide",
  idvar = "ID",
  timevar = "q"
)

  ID Product.1    Date.1 Product.2    Date.2   Product.3    Date.3
1  1      Bike  1/1/2000      Tire  2/1/2000 Chronometer 20/2/2000
3  2       Car 15/2/2000      Seat 17/2/2000        <NA>      <NA>

如果你不想保留Date,你可以试试这个

reshape(
  transform(
    subset(df, select = -Date),
    q = ave(1:nrow(df), ID, FUN = seq_along)
  ),
  direction = "wide",
  idvar = "ID",
  timevar = "q"
)

这使

  ID Product.1 Product.2   Product.3
1  1      Bike      Tire Chronometer
3  2       Car      Seat        <NA>

数据

> dput(df)
structure(list(ID = c(1L, 1L, 2L, 2L, 1L), Product = c("Bike", 
"Tire", "Car", "Seat", "Chronometer"), Date = c("1/1/2000", "2/1/2000",
"15/2/2000", "17/2/2000", "20/2/2000")), class = "data.frame", row.names = c(NA,
-5L))
于 2021-03-02T15:20:05.317 回答