我正在尝试为 R 中的多个 ID 创建一系列年份。我的输入表每个 ID 都有一行,并给出了一个 Start_year。它看起来像这样:
ID Start_year
01 1999
02 2004
03 2015
04 2007
等等...
我需要为每个 ID 创建一个包含多行的表,显示从 Start_year 到 2015 年的每一年。然后我将使用它连接到另一个表。因此,在我的示例中,ID1 将有 17 行,年份为 1999:2015。 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)
然而,我的完整数据集有大约 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
# ...
在你的情况下,你可能需要做
setDT(df)[, .(col = seq.int(Start_year, 2015L)), by = ID]
一个
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()
数据
text <- "ID Start_year
01 1999
02 2004
03 2015
04 2007"
library(data.table)
DT <- fread(text)
关于r - 更快相当于 group_by %>% 在 R 中扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55103276/