【发布时间】:2018-05-21 01:28:08
【问题描述】:
我的代码遇到了一些问题,欢迎提出任何建议以使其运行得更快。 我有一个看起来像这样的数据框:
Name <- c("a","a","a","a","a","b","b","b","b","c")
Category <- c("sun","cat","sun","sun","sea","sun","sea","cat","dog","cat")
More_info <- c("table","table","table","table","table","table","table","table","table","cat")
d <- data.frame(Name,Category,More_info)
所以我在名称列中的每一行都有重复的条目(重复的数量可能会有所不同)。对于每个条目(a,b,...),我想计算 Category 列中每个相应元素的总和,并保留唯一出现最多的类别。如果一个条目具有相同数量的类别,我想随机选取大多数类别之一。 所以在这种情况下,输出数据框将如下所示:
Name <- c("a","b","c")
Category <- c("sun","dog","cat")
More_info <- c("table","table","table")
d <- data.frame(Name,Category,More_info)
a 保留 sun 条目,因为它出现最多,b 将是 dog 或任何其他值,因为它们都与 b 一起出现一次,并且 c 不会改变。 我的函数如下所示:
my_choosing_function <- function(x){
tmp = dbSNP_hapmap[dbSNP_hapmap$refsnp_id==list_of_snps[x],]
snp_freq <- as.data.frame(table(tmp$consequence_type_tv))
best_hit <- snp_freq[order(-snp_freq$Freq),]
best_hit$SNP<-list_of_snps[x]
top<-best_hit[1,]
return(top)
}
trst <- lapply(1:length(list_of_snps), function(x) my_choosing_function(x))
final <- do.call("rbind",trst)
我从一个唯一元素列表(在我们的例子中是名称)开始,对于每个元素我做一个重复条目的表格,我按降序排列表格并保留顶部元素。我对唯一值列表中的每个元素执行一次 lapply,然后对整个内容执行一次 rbind。
由于我的初始数据框中有 2500000 行和 1500000 个唯一元素,因此它需要很长时间才能运行。 100 行需要 4 秒,那么 lapply 总共需要 34 小时。
我确信像 dplyr 这样的软件包可以在几分钟内完成,但找不到解决方案。有人有想法吗? 非常感谢您的帮助!
【问题讨论】: