简体   繁体   English

reshape 从宽到长,简单 data.table issue

[英]reshape from wide to long, simple data.table issue

I know there must be a one-line data.table solution for this, probably with dcast , but I can't figure it out.我知道必须有一个单行data.table解决方案,可能是dcast ,但我无法弄清楚。

I have data like this:我有这样的数据:

library(data.table)
data1 <- data.table(
  id = seq(1:5),
  code = c("A","A","B","A","B"),
  date = as.Date( c("2021-08-11","2021-01-05","2021-02-18","2021-02-13","2021-12-13" ))
)
data2 <- data.table(
  id = seq(1:5),
  code = c("B","B","A","B","A"),
  date = as.Date( c("2021-08-13","2021-01-05","2021-02-19","2021-02-14","2021-12-13" ))
)
data3 <- rbind(data1, data2)

I simply wish to reshape to a wide format like this我只是想重塑成这样的宽幅

data_want <- data.table(
  id = seq(1:5),
  code1 = c("A", "A","B","A","B"),
  data1 = c("2021-08-11", "2021-01-05","2021-02-18","2021-02-13","2021-12-13"),
  code2 = c("B", "B","A","B","A"),
  data2 = c("2021-08-13", "2021-01-05","2021-02-19","2021-02-14","2021-12-13")
)

How to do it with dcast ?如何用dcast做到这一点?

You could also make use of rowid as follows您还可以按如下方式使用rowid

dcast(data3, id ~ rowid(id), value.var = c("code", "date"))
#   id code_1 code_2     date_1     date_2
#1:  1      A      B 2021-08-11 2021-08-13
#2:  2      A      B 2021-01-05 2021-01-05
#3:  3      B      A 2021-02-18 2021-02-19
#4:  4      A      B 2021-02-13 2021-02-14
#5:  5      B      A 2021-12-13 2021-12-13
# load package
library(data.table)

# create batch number
data3[, batch := 1:.N, id]

# long to wide
data4 <- dcast(data3
                , id ~ batch
                , value.var = c('code', 'date')
                ); data4

   id code_1 code_2     date_1     date_2
1:  1      A      B 2021-08-11 2021-08-13
2:  2      A      B 2021-01-05 2021-01-05
3:  3      B      A 2021-02-18 2021-02-19
4:  4      A      B 2021-02-13 2021-02-14
5:  5      B      A 2021-12-13 2021-12-13

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM