组合不同长度的长格式数据帧并转换为宽格式

Posted

技术标签:

【中文标题】组合不同长度的长格式数据帧并转换为宽格式【英文标题】:Combine long-format data frames with different length and convert to wide format 【发布时间】:2022-01-04 18:40:35 【问题描述】:

由于time 变量(面板数据不平衡),我想组合不同长度的长格式数据帧:

set.seed(63)
#function to create a data frame that includes id, time and x
func1 <- function (size=5) 
             x=sample(c(0,1), 1)
             data.frame(time=1:size, x=x)
    
#function to row combine data frames
func2 <- do.call("rbind", Map(function(x,y) 
             data.frame(id=x, func1(y))
             , 1:5, 5))
    
#Sample 10 observations to create imbalanced panel data
dd <- func2[sample(nrow(func2), 10), ]  
fd <- dd[with(dd, order(id, time)),]
> fd
   id time x
1   1    1 0
2   1    2 0
3   1    3 0
4   1    4 0
5   1    5 0
10  2    5 1
13  3    3 0
17  4    2 0
18  4    3 0
21  5    1 0

最后,我想将其转换为宽格式,并根据 time 变量用 NA 填充 x 的跳过单元格。像这样的:

id    x.time1 x.time2 x.time3 x.time4 x.time5 
1       0       0       0       0       0
2       NA      NA      NA      NA      1
3       NA      NA      0       NA      NA
4       NA      0       0       NA      NA
5       0       NA      NA      NA      NA

【问题讨论】:

是的,这是一个错字。我更正了。 【参考方案1】:

一个可能的解决方案:

library(tidyverse)

fd <- data.frame(
          id = c(1L, 1L, 1L, 1L, 1L, 2L, 3L, 4L, 4L, 5L),
        time = c(1L, 2L, 3L, 4L, 5L, 5L, 3L, 2L, 3L, 1L),
           x = c(0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L)
)

fd %>% 
  pivot_wider(id, names_from = time, values_from = x, names_prefix = "x.time")

#> # A tibble: 5 × 6
#>      id x.time1 x.time2 x.time3 x.time4 x.time5
#>   <int>   <int>   <int>   <int>   <int>   <int>
#> 1     1       0       0       0       0       0
#> 2     2      NA      NA      NA      NA       1
#> 3     3      NA      NA       0      NA      NA
#> 4     4      NA       0       0      NA      NA
#> 5     5       0      NA      NA      NA      NA

【讨论】:

谢谢@Paul!我赞成你的回答,但接受了 akrun 的 data.table 解决方案,因为据说它比 tidyverse 不客气,@cliu!没问题:我来这里是为了学习而不是为了获得 *** 的声誉! ;-)【参考方案2】:

使用data.table

library(data.table)
dcast(setDT(fd), id ~ paste0('x.time', time), value.var = 'x')

-输出

   id x.time1 x.time2 x.time3 x.time4 x.time5
1:  1       0       0       0       0       0
2:  2      NA      NA      NA      NA       1
3:  3      NA      NA       0      NA      NA
4:  4      NA       0       0      NA      NA
5:  5       0      NA      NA      NA      NA

【讨论】:

以上是关于组合不同长度的长格式数据帧并转换为宽格式的主要内容,如果未能解决你的问题,请参考以下文章

TSQL Pivot 4值列

将长格式面板数据重塑为宽堆叠时间序列

将多个值列重塑为宽格式

正则表达式,用于验证不同格式的字符串,用于特殊时间转换[重复]

TypeError:在字符串格式化python期间并非所有参数都转换了

如何将多个变量的重复测量值传播为宽格式?