R中大数据的有效字符串匹配(和索引编制)提示?

问题描述 投票:3回答:1

我想做什么

我有许多唯一的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-” ...

r string string-matching large-data processing-efficiency
1个回答
2
投票
这里是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)

© www.soinside.com 2019 - 2024. All rights reserved.