Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 创建一个新的数据框,在前一个数据框的两列之间按顺序为每个值创建行_R_Dataframe_Dplyr_Tidyr - Fatal编程技术网

R 创建一个新的数据框,在前一个数据框的两列之间按顺序为每个值创建行

R 创建一个新的数据框,在前一个数据框的两列之间按顺序为每个值创建行,r,dataframe,dplyr,tidyr,R,Dataframe,Dplyr,Tidyr,我有一个数据框,其中两列表示一系列日期的开始和结束。因此: df <- data.frame(var=c("A", "B"), start_year=c(2000, 2002), end_year=c(2005, 2004)) > df var start_year end_year 1 A 2000 2005 2 B 2002 2004 理想情况下,这将涉及一些来自tidyverse的信息。我一直在用dplyr::group_

我有一个数据框,其中两列表示一系列日期的开始和结束。因此:

df <- data.frame(var=c("A", "B"), start_year=c(2000, 2002), end_year=c(2005, 2004))

> df
  var start_year end_year
1   A       2000     2005
2   B       2002     2004

理想情况下,这将涉及一些来自tidyverse的信息。我一直在用
dplyr::group_by
tidyr::gather
尝试不同的事情,但我没有任何运气。

我们可以使用
map2
获得从“开始年”到“结束年”和
unest
列表列的序列,以将数据扩展为“长”格式

library(tidyverse)
df %>%
   transmute(var, year = map2(start_year, end_year, `:`)) %>%
   unnest
#   var year
#1   A 2000
#2   A 2001
#3   A 2002
#4   A 2003
#5   A 2004
#6   A 2005
#7   B 2002
#8   B 2003
#9   B 2004

或者另一个选项是
complete

df %>%
     group_by(var) %>% 
     complete(start_year = start_year:end_year) %>% 
     select(var, year = start_year)

或者在
base R
中使用
stack
Map

stack(setNames(do.call(Map, c(f = `:`, df[-1])), df$var))
注意:首先用
Map
stack

如有其他变化

stack(setNames(Map(`:`, df[[2]], df[[3]]), df$var))
stack(setNames(do.call(mapply, c(FUN = `:`, df[-1])), df$var))

正如akrun所展示的,如果不使用
聚集
分组
(如问题中所述),可能会更容易完成。但如果你想知道怎么做的话,就在这里

df %>% 
  gather(key, value, -var) %>% 
  group_by(var) %>% 
  expand(year = value[1]:value[2])

# # A tibble: 9 x 2
# # Groups:   var [2]
#   var    year
#   <fct> <int>
# 1 A      2000
# 2 A      2001
# 3 A      2002
# 4 A      2003
# 5 A      2004
# 6 A      2005
# 7 B      2002
# 8 B      2003
# 9 B      2004
编辑:正如markus指出的,您不需要先用data.table转换为long,您可以一步完成(不包括上面代码块中的两行库/setDT)。这与akrun的tidyverse答案类似

df[, .(year = start_year:end_year), by=var]

带有
seq
的短基R解决方案

stack(setNames(Map(seq, df[[2]], df[[3]]), df[[1]]))
#   values ind
# 1   2000   A
# 2   2001   A
# 3   2002   A
# 4   2003   A
# 5   2004   A
# 6   2005   A
# 7   2002   B
# 8   2003   B
# 9   2004   B
数据

df
df[, .(year = start_year:end_year), by=var]
stack(setNames(Map(seq, df[[2]], df[[3]]), df[[1]]))
#   values ind
# 1   2000   A
# 2   2001   A
# 3   2002   A
# 4   2003   A
# 5   2004   A
# 6   2005   A
# 7   2002   B
# 8   2003   B
# 9   2004   B
df <- structure(list(var = structure(1:2, .Label = c("A", "B"), class = "factor"), 
    start_year = c(2000, 2002), end_year = c(2005, 2004)), class = "data.frame", row.names = c(NA, 
-2L))