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



这些样本数据帧具有分段回归线的两段数据。在";df";,segment_start是段的开始,segment_end是段的结束。有一个2000-2010年的数据点"值";是线段的坡度。第一部分是2000-2006年,第二部分是2007-2010年。我试图做的是将行组合为";obs";1成单行,包括2000-2010的所有数据点,如"1"所示;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

假设您有非重叠区域,如

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)

关于开始/结束以及每个间隔结束值是打开还是关闭,保持一致是很重要的。

对于原始数据帧,可以使用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

最新更新