以特定方式将数据重新排列为更宽的格式

Rearrange data into a wider format in a specific manner

这些示例数据框包含分段回归线的两个段的数据。在“df”中,segment_start是段的开始,segment_end是段的结束。有一个 2000-2010 年的数据点。 “值”是段的斜率。第一段从 2000-2006 年开始,第二段从 2007-2010 年开始。我想要做的是将“obs”1 的行合并为一行,包括 2000-2010 年的所有数据点,如“df2”所示。是否有代码可以自动执行此过程?感谢您提前提出任何想法。

#data I have:
df <- tibble("obs" = 1:1, 
             "segment"=c(1,2), 
             "segment_start"=c(2000,2006), 
             "segment_end"=c(2006, 2010),
             "value"=c(0.5, 1.5))

df

#data I want:
df2 <- tibble("obs"=1,
             "2000"=0.5,
             "2001"=0.5,
             "2002"=0.5,
             "2003"=0.5,
             "2004"=0.5,
             "2005"=0.5,
             "2006"=0.5,
             "2007"=1.5,
             "2008"=1.5,
             "2009"=1.5,
             "2010"=1.5)

df2

假设您有 non-overlapping 个区域,例如

df <- tibble("obs" = 1:1, 
             "segment"=c(1,2), 
             "segment_start"=c(2000, 2007), 
             "segment_end"=c(2006, 2010),
             "value"=c(0.5, 1.5))

然后您可以使用 rowisemutate() 为每一行创建一个序列。然后使用 tidyr::unnest_longer 将它们扩展成行。最后,您使用 tidyr::pivot_wider 将这些行转换为列

df %>% 
  rowwise() %>% 
  mutate(year = list(segment_start:segment_end)) %>% 
  unnest_longer(year) %>% 
  pivot_wider(obs, names_from=year, values_from=value)

重要的是 start/ends 以及每个间隔结束值是打开还是关闭。

使用原始数据框,可以使用 complete + fill + pivot_wider.

完成预期的输出
library(tidyverse)

df %>% 
  complete(segment_start = full_seq(c(min(segment_start), max(segment_end)), 1)) %>% 
  fill(obs, segment, value) %>% 
  pivot_wider(-c(segment, segment_end), names_from = segment_start)

# A tibble: 1 x 12
    obs `2000` `2001` `2002` `2003` `2004` `2005` `2006` `2007` `2008` `2009` `2010`
  <int>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1     1    0.5    0.5    0.5    0.5    0.5    0.5    1.5    1.5    1.5    1.5    1.5