根据 r 中的条件重塑
reshaping based on condition in r
我无法找到我想要的结果。我试图先将我的数据重塑为宽格式,然后再恢复为长格式。这是一个非常简单的代码:
set.seed(1)
dat <- data.frame(
id = rep(c("one", "two"), each=4),
program = rep(1:4, 2),
days = sample(1:100, 8, replace=FALSE),
min.date = sample(2000:2015, 8, replace = TRUE),
max.date = sample(2014:2019, 8, replace = TRUE))
数据:
id program days min.date max.date
one 1 27 2010 2018
one 2 37 2000 2019
one 3 57 2003 2016
one 4 89 2002 2018
two 1 20 2010 2019
two 2 86 2006 2016
two 3 97 2012 2018
two 4 62 2014 2014
我想如何重塑这个长数据是使用 min.date
和 max.date
变量为每个程序创建一个宽格式。这是我预期的宽格式:
id program.1.2010 program.1.2011 program.1.2012 program.1.2013 ...
one 27 27 27 27 ...
two 20 20 20 20 ...
本质上,每个 id 都会有每个节目在 min.date
和 max.date
之间以宽格式拍摄的天数。任何想法将不胜感激。
是这样的吗?
require(dplyr)
df1 %>% group_by(id,program) %>%
mutate(daterange=paste(seq(min.date,max.date),collapse=",")) %>%
separate_rows(daterange,sep=",") %>% select(-min.date,-max.date) %>%
spread(program,days)
mutate
创建每个范围内所有年份的字符串,以逗号分隔。
separate_rows
然后获取这个字符串,在逗号处将其分解,并为每个值创建一个新行,然后我们可以 spread
创建我认为是您实际需要的格式。最后一步可能是不必要的,这取决于我如何解释您上面的评论。
结果:
id daterange `1` `2` `3` `4`
<chr> <chr> <int> <int> <int> <int>
1 one 2000 NA 37 NA NA
2 one 2001 NA 37 NA NA
3 one 2002 NA 37 NA 89
4 one 2003 NA 37 57 89
5 one 2004 NA 37 57 89
6 one 2005 NA 37 57 89
7 one 2006 NA 37 57 89
8 one 2007 NA 37 57 89
9 one 2008 NA 37 57 89
10 one 2009 NA 37 57 89
# ... with 24 more rows
我无法找到我想要的结果。我试图先将我的数据重塑为宽格式,然后再恢复为长格式。这是一个非常简单的代码:
set.seed(1)
dat <- data.frame(
id = rep(c("one", "two"), each=4),
program = rep(1:4, 2),
days = sample(1:100, 8, replace=FALSE),
min.date = sample(2000:2015, 8, replace = TRUE),
max.date = sample(2014:2019, 8, replace = TRUE))
数据:
id program days min.date max.date
one 1 27 2010 2018
one 2 37 2000 2019
one 3 57 2003 2016
one 4 89 2002 2018
two 1 20 2010 2019
two 2 86 2006 2016
two 3 97 2012 2018
two 4 62 2014 2014
我想如何重塑这个长数据是使用 min.date
和 max.date
变量为每个程序创建一个宽格式。这是我预期的宽格式:
id program.1.2010 program.1.2011 program.1.2012 program.1.2013 ...
one 27 27 27 27 ...
two 20 20 20 20 ...
本质上,每个 id 都会有每个节目在 min.date
和 max.date
之间以宽格式拍摄的天数。任何想法将不胜感激。
是这样的吗?
require(dplyr)
df1 %>% group_by(id,program) %>%
mutate(daterange=paste(seq(min.date,max.date),collapse=",")) %>%
separate_rows(daterange,sep=",") %>% select(-min.date,-max.date) %>%
spread(program,days)
mutate
创建每个范围内所有年份的字符串,以逗号分隔。
separate_rows
然后获取这个字符串,在逗号处将其分解,并为每个值创建一个新行,然后我们可以 spread
创建我认为是您实际需要的格式。最后一步可能是不必要的,这取决于我如何解释您上面的评论。
结果:
id daterange `1` `2` `3` `4`
<chr> <chr> <int> <int> <int> <int>
1 one 2000 NA 37 NA NA
2 one 2001 NA 37 NA NA
3 one 2002 NA 37 NA 89
4 one 2003 NA 37 57 89
5 one 2004 NA 37 57 89
6 one 2005 NA 37 57 89
7 one 2006 NA 37 57 89
8 one 2007 NA 37 57 89
9 one 2008 NA 37 57 89
10 one 2009 NA 37 57 89
# ... with 24 more rows