有没有一种方法可以用运行速度更快的方法替换R中的此循环?

时间:2019-08-08 14:12:10

标签: r loops

简而言之,我正在努力加快速度。这是我的慢代码:

library(dplyr)
tmp <- unique(kat$pnr) # Sort out the unique entries (ends up to about 572000)
sex = c()
for(i in tmp){         # For each unique pnr, look up the sex and append it to the new dataset
  temptable <- filter(kat, pnr == i)
  sex[i] <- temptable$sex
}

当前,该循环将花费我几个小时,因为我在tmp数据集中有572000行要循环通过,当我进行一些较短的测试运行时,似乎系统每秒处理约50行。那么,有没有一种方法可以用运行速度更快的东西来代替这个循环?

在kat数据集中,我大约有40列和905000行,其中pnr是唯一标识符,但是,一个pnr可以在kat中出现一到两次。我想进行性别统计,因此我基本上想整理出唯一的pnrs和每个pnr的性别。

1 个答案:

答案 0 :(得分:2)

带有==的唯一元素中的filter会更慢,并且也会循环播放。相反,对于这种情况,如果我们想在“性别”列上为“ pnr”的每个唯一元素找到一些描述性统计信息,则groupby操作可能更合适。

library(dplyr)
kat %>%
    group_by(pnr) %>%
    summarise(val = fn(sex))

使用data.table

可以使速度更快
library(data.table)
setDT(kat)[, .(val = fn(sex)), by = .(pnr)]

注意:不清楚要在“性别”列上应用的功能


如果打算创建list中的sex,则

lst1 <- split(kat$sex, kat$pnr)