以特定方式将数据重新排列为更宽的格式
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))
然后您可以使用 rowise
和 mutate()
为每一行创建一个序列。然后使用 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
这些示例数据框包含分段回归线的两个段的数据。在“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))
然后您可以使用 rowise
和 mutate()
为每一行创建一个序列。然后使用 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