首页 > 解决方案 > 使用干预观察扩展数据框

问题描述

我正在尝试扩展 R 中的数据框,其中缺少并非立即显而易见的观察结果。这就是我的意思:

data.frame(id = c("a","b"),start = c(2002,2004), end = c(2005,2007))

这是:

 id start  end
1  a  2002 2005
2  b  2004 2007

我想要的是一个新的数据框,总共有 8 个观察值,“a”和“b”各 4 个,并且一年是开始和结束(包括)之间的值之一。所以:

id year
a 2002
a 2003
a 2004
a 2005
b 2004
b 2005
b 2006
b 2007

据我了解,各种版本的 expand 仅适用于唯一值,但在这里我的数据框没有所有唯一值(明确)。

我正在考虑逐步遍历每一行,然后使用 sapply() 生成一个数据框,然后将所有新数据框连接在一起。但是这种尝试失败了:

sapply(test,function(x) { data.frame( id=rep(id,x[["end"]]-x[["start"]]), year = x[["start"]]:x[["end"]] )})

我知道必须有一些 dplyr 或其他魔法来解决这个问题!

标签: rdataframedplyr

解决方案


你可以使用tidyrdplyr

library(tidyr)
library(dplyr)

df %>% 
  gather(key = key, value = year, -id) %>% 
  select(-key) %>% 
  group_by(id) %>%
  complete(year = full_seq(year,1))

# A tibble: 8 x 2
# Groups:   id [2]
  id     year
  <fct> <dbl>
1 a      2002
2 a      2003
3 a      2004
4 a      2005
5 b      2004
6 b      2005
7 b      2006
8 b      2007

推荐阅读