【问题标题】:reshaping based on condition in r根据 r 中的条件进行整形
【发布时间】:2019-03-05 18:09:14
【问题描述】:

我很难找到我想要的结果。我正在尝试首先将我的数据重塑为宽格式并恢复为长格式。这是一个非常简单的代码:

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.datemax.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.datemax.date 之间以宽格式记录每个程序的天数。任何想法将不胜感激。

【问题讨论】:

  • 你用什么代码来重塑,发生了什么?
  • 您的预期输出与输入不匹配
  • 您是否正在为每个 min.date-max.date-program 组合寻找单个列?
  • @iod 是的,这就是我要找的。我似乎无法弄清楚第一步该做什么
  • 查看您的期望结果,看起来您实际上正在寻找的是每个年度计划组合的单列,数据仅包含在最小-最大值范围内的计划年度中该程序/ID的范围。那……可能不是一个好的数据结构。你到底想达到什么目的?听起来像是 XY 问题

标签: r reshape


【解决方案1】:

这样的?

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

【讨论】:

  • 哇,是的,这正是我想要的。抱歉,我的问题不清楚。
猜你喜欢
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 2020-05-17
  • 2021-10-30
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多