r - 更快相当于 group_by %>% 在 R 中扩展

标签 r performance dplyr data.table data-manipulation

我正在尝试为 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/

相关文章:

r - 在 R 中向 `summary(aov)` 的输出添加一列?

r - 如何使用sentimentr或qdap检测否定句

java - 使用长变量作为其大小创建长数组时的错误感到困惑

r - R 中的累积百分比

r - 对名称以相同数字开头的一对列进行操作

运行多行代码但在 R 中出现错误而停止(来自 RStudio)?

r - 如何摆脱 R 中 gtsummary 包创建的表中的前导零?

python - 为什么 ctypes 将 Python 列表转换为 C 数组的速度如此之慢?

当限制到达最后一条记录时,mysql查询变慢

r - 获取跨数据框列的频率计数的更有效方法