r中基于条件的整形

r中基于条件的整形,r,reshape,R,Reshape,我很难找到我想要的结果。我正在尝试先将数据重塑为宽格式,然后再重塑为长格式。下面是一个非常简单的代码: 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 = s

我很难找到我想要的结果。我正在尝试先将数据重塑为宽格式,然后再重塑为长格式。下面是一个非常简单的代码:

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))
我想要重塑这个长数据的方式是使用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创建一个字符串,其中包含每个范围内的所有年份,并用逗号分隔。 然后,单独的_行接受这个字符串,在逗号处将其分解,并为每个值创建一个新行,然后我们可以将其展开以创建我认为是您实际需要的格式。最后一步可能是不必要的,这取决于我如何理解你上面的评论。 结果:


您使用了什么代码来重塑形状以及发生了什么?您的预期输出与输入不匹配您是否要为每个min.date-max.date-program组合查找一列?@iod是的,这就是我要查找的。我似乎不知道第一步该怎么做,即使看你的期望结果,看起来你实际上在寻找的是每一年计划组合的一列,数据只包含在该计划/id的最小-最大范围内的计划年中。那就是。。。可能不是一个好的数据结构。你到底想达到什么目的?听起来像是XY问题哇,是的,这正是我想要的。对不起,我的问题不清楚。
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)
   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