rw2*_*rw2 3 r data-manipulation dplyr data.table
我正在尝试为R中的多个ID创建年份序列。我的输入表的每个ID都有一行,并提供了一个Start_year。看起来像这样:
ID Start_year
01 1999
02 2004
03 2015
04 2007
Run Code Online (Sandbox Code Playgroud)
等等...
我需要为每个ID创建一个包含多行的表,以显示从其Start_year到2015年的每一年。然后,我将使用此表连接到另一个表。因此,在我的示例中,ID1在1999:2015年将有17行。ID2将具有12行2004:2015,ID3将具有1行2015,ID4将具有9行2007:2015。
对于我的数据的子集,我可以使用以下代码来使其工作:
df %>% group_by(ID) %>% expand(year = Start_year:2015, Start_year) %>% select(-Start_year)
Run Code Online (Sandbox Code Playgroud)
但是,我的完整数据集有大约500万个ID,此命令似乎非常慢,耗时数小时。
因此,我正在R中寻找该命令的更快实现。以我的经验,data.table命令似乎通常比dplyr / tidyr更快-但是,我对data.table语法并不熟悉。
你可以做
out <- DT[, .(col = seq.int(Start_year, 2015L)), by = ID]
out
# ID col
# 1: 1 1999
# 2: 1 2000
# 3: 1 2001
# 4: 1 2002
# 5: 1 2003
# 6: 1 2004
# 7: 1 2005
# 8: 1 2006
# 9: 1 2007
# ...
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您可能需要做
setDT(df)[, .(col = seq.int(Start_year, 2015L)), by = ID]
Run Code Online (Sandbox Code Playgroud)
一个tidyverse同样的想法的方式
library(readr); library(dplyr); library(tidyr)
tbl <- read_table(text)
tbl %>%
group_by(ID) %>%
mutate(Start_year = list(seq.int(Start_year, 2015L))) %>%
# rename(new_col = Start_year)
unnest()
Run Code Online (Sandbox Code Playgroud)
数据
text <- "ID Start_year
01 1999
02 2004
03 2015
04 2007"
library(data.table)
DT <- fread(text)
Run Code Online (Sandbox Code Playgroud)