R 用干涉观测扩展数据框

R 用干涉观测扩展数据框,r,dataframe,dplyr,R,Dataframe,Dplyr,我试图在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个,一年是开始和结束之间的一个值(包括)。因此: 据我所知,expand的各种版本只处理唯一值,但在这里,我的数据帧并没有所

我试图在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个,一年是开始和结束之间的一个值(包括)。因此:

据我所知,expand的各种版本只处理唯一值,但在这里,我的数据帧并没有所有唯一值(显式)

我想一步一步地遍历每一行,然后用sapply()生成一个数据帧,然后将所有新的数据帧连接在一起。但这一尝试失败了:

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

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

您可以使用
tidyr
dplyr

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
library(tidyr)
图书馆(dplyr)
df%>%
聚集(键=键,值=年,-id)%>%
选择(-key)%%>%
分组依据(id)%>%
完整(年份=完整(年份,1))
#一个tibble:8x2
#组别:id[2]
身份证年份
1 a 2002年
2003年2月a日
3 a 2004
4 a 2005年
5 b 2004年
6 b 2005年
7 b 2006
8 b 2007年

您可以使用
tidyr
dplyr

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
library(tidyr)
图书馆(dplyr)
df%>%
聚集(键=键,值=年,-id)%>%
选择(-key)%%>%
分组依据(id)%>%
完整(年份=完整(年份,1))
#一个tibble:8x2
#组别:id[2]
身份证年份
1 a 2002年
2003年2月a日
3 a 2004
4 a 2005年
5 b 2004年
6 b 2005年
7 b 2006
8 b 2007年

使用
dplyr
tidyr
,我创建了一个包含年份列表的新列,然后取消数据框的测试

library(tidyr)
library(dplyr)

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


df %>% 
  rowwise() %>% 
  mutate(year = list(seq(start, end))) %>% 
  select(-start, -end) %>% 
  unnest()
library(tidyr)
图书馆(dplyr)
df%
行()
突变(年份=列表(顺序(开始、结束))%>%
选择(-start,-end)%>%
unnest()
输出

# A tibble: 8 x 2
  id      year
  <fct>  <int>
1 a       2002
2 a       2003
3 a       2004
4 a       2005
5 b       2004
6 b       2005
7 b       2006
8 b       2007
#一个tible:8 x 2
身份证年份
1 a 2002年
2003年2月a日
3 a 2004
4 a 2005年
5 b 2004年
6 b 2005年
7 b 2006
8 b 2007年

使用
dplyr
tidyr
,我创建了一个包含年份列表的新列,然后取消数据框的测试

library(tidyr)
library(dplyr)

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


df %>% 
  rowwise() %>% 
  mutate(year = list(seq(start, end))) %>% 
  select(-start, -end) %>% 
  unnest()
library(tidyr)
图书馆(dplyr)
df%
行()
突变(年份=列表(顺序(开始、结束))%>%
选择(-start,-end)%>%
unnest()
输出

# A tibble: 8 x 2
  id      year
  <fct>  <int>
1 a       2002
2 a       2003
3 a       2004
4 a       2005
5 b       2004
6 b       2005
7 b       2006
8 b       2007
#一个tible:8 x 2
身份证年份
1 a 2002年
2003年2月a日
3 a 2004
4 a 2005年
5 b 2004年
6 b 2005年
7 b 2006
8 b 2007年

一个使用
数据的简单解决方案。表

library(data.table)

# option 1
setDT(df)[, .(year = seq(start, end)), by = id]

# option 2
setDT(df)[, .(year = start:end), by = id]
其中:


基于R的方法:

lst <- Map(seq, df$start, df$end)

data.frame(id = rep(df$id, lengths(lst)), year = unlist(lst))

lst使用
数据的简单解决方案。表

library(data.table)

# option 1
setDT(df)[, .(year = seq(start, end)), by = id]

# option 2
setDT(df)[, .(year = start:end), by = id]
其中:


基于R的方法:

lst <- Map(seq, df$start, df$end)

data.frame(id = rep(df$id, lengths(lst)), year = unlist(lst))

l谢谢!这很有效。。。但是如果我想把其他变量复制到这些中间的观察结果中,就失败了,不仅仅是id。可以用这段代码完成,但是@Jack Brookes的输入更少。这一切都取决于你想对中间几年的数值做什么。@p不管
数据如何。
-我发布的解决方案甚至更少键入;-)谢谢这很有效。。。但是如果我想把其他变量复制到这些中间的观察结果中,就失败了,不仅仅是id。可以用这段代码完成,但是@Jack Brookes的输入更少。这一切都取决于你想对中间几年的数值做什么。@p不管
数据如何。
-我发布的解决方案甚至更少键入;-)谢谢这管用!添加其他变量很容易;它们会自动复制过来,这正是我想要的。谢谢!这管用!添加其他变量很容易;它们会自动复制过来,这正是我想要的。