我在R中有一个带有330000个值的字符向量,例如
amp184660
amp947
amp53303
amp364886
amp121615
和这样的数据框:
我想从数据框的第一列中的我的字符向量中找到每个值,即“测定名称”,然后将其相应的染色体位置,即“Chrom”输出到新的向量中。我想尽快做到这一点,因为有大约330k条目,通过循环grep这样做大约需要12个小时才能完成。
有什么想法吗? 谢谢 杰森。
答案 0 :(得分:1)
我建议%in%
,这可能比merge
更快。这是一个玩具示例:
## Assume that "x" is your data.frame
set.seed(1)
x <- data.frame(Assay = sample(letters, 30, replace = TRUE),
Chrom = 4, ChromPos = rnorm(30))
## And that "y" is your vector you want to match
y <- c("a", "b", "c", "d", "e")
## Here's how you can use %in%
x[x$Assay %in% y, ]
# Assay Chrom ChromPos
# 10 b 4 0.6198257
# 12 e 4 -0.1557955
# 24 d 4 1.1000254
# 27 a 4 -0.2533617
## And can also directly extract a specific column
x[x$Assay %in% y, "ChromPos"]
# [1] 0.6198257 -0.1557955 1.1000254 -0.2533617
答案 1 :(得分:0)
# assume your df called your_data_frame and vector called your_character_vector
vector_frame<-data.frame("Assay Name"=your_character_vector)
merge(vector_frame,your_data_frame,by="Assay Name")[,3]
注意我将列符号从$ Chrom更改为[,3],因为我看到你想要第三列而R将重命名$ call中的列,例如到Chrom.Pos..bp。或类似的东西 - 如果你键入$并在RStudio编辑器中按TAB它会给你选项
答案 2 :(得分:0)
如果运行时仍然存在问题,使用data.table
包大约是。比merge
快100倍,比%in%
快50倍:
library(data.table)
dt <- as.data.table( yourDataFrame )
setkey( dt, Assay )
dt[ J(yourVector) ]