我想做什么
我有许多唯一的ID,例如id1, id2, etc.
。它们出现在多个组中,每个组都是1到100个ID之间的随机样本,例如
[1] "id872- id103- id746-"
[2] "id830- id582-"
[3] "id663- id403- id675- id584- id866- id399- id28- id550-"
我想找到一个ID所属的所有组,例如对于id1
groups.with.id[1] = grep("id1-", groups)
我的问题
数据很大(8万个ID,1M组),在我的笔记本电脑上大约需要12小时。我认为这是以下事实的组合:我正在做80k次(每个id一次),并且每次我访问一个巨大的对象(1M组)。
有什么方法可以提高效率?
(我经常遇到R中较大的对象的问题。例如,重复索引具有超过1万行的数据帧会很快变慢。 示例代码
# make toy dataset
n.ids = 80000 # number of unique ids
n.groups = 100 # number of groupings
# make data
ids = paste("id", 1:n.ids, "-", sep="")
groups = character(n.groups)
for (ii in 1:n.groups) {
group.size = ceiling(runif(1) * 10)
groups[ii] = paste(sample(ids, group.size), collapse=" ")
}
# execute and time
t1 = Sys.time()
groups.with.id = sapply(ids, grep, groups)
difftime(Sys.time(), t1)
> Time difference of 29.63272 secs
在此示例中,500个群组大约需要30秒。我想扩大到100万个小组。有没有有效的方法?
我想做什么,我有许多唯一的ID,例如id1,id2等。它们出现在多个组中,每个组都是1到100个id之间的随机样本,例如[1]“ id872- id103- id746-” ...
tidyverse
替代项。一个可能的缺点是,数据中不存在的ID将不会包含在输出中-尽管可以在必要时解决此问题。library(tidyverse)
groups.with.id <- groups %>%
enframe() %>%
separate_rows(value, sep = " ") %>%
group_by(value) %>%
summarise(ids = list(name)) %>%
mutate(ids = set_names(ids, value)) %>%
pull(ids)