Быстрый способ выбора строк в таблице в R?
Я ищу быстрый способ извлечь большое количество строк с еще большим столом. Верхняя часть моего стола выглядит следующим образом:--5-->
> head(dbsnp)
snp gene distance
rs5 rs5 KRIT1 1
rs6 rs6 CYP51A1 1
rs7 rs7 LOC401387 1
rs8 rs8 CDK6 1
rs9 rs9 CDK6 1
rs10 rs10 CDK6 1
размеры:
> dim(dbsnp)
[1] 11934948 3
Я хочу выбрать строки, которые имеют имена строк, содержащиеся в списке:
> head(features)
[1] "rs1367830" "rs5915027" "rs2060113" "rs1594503" "rs1116848" "rs1835693"
> length(features)
[1] 915635
неудивительно, что простой способ сделать это temptable = dbsnp[features,]
принимает совсем длительное время.
Я искал способы сделать это через пакет sqldf я думал, что так будет быстрее. К сожалению, я не могу понять, как выбрать строки с определенными именами строк в SQL.
спасибо.
3 ответов
способ, которым большинство людей изначально пытались бы это сделать:
dbsnp[ rownames(dbsnp) %in% features, ] # which is probably slower than your code
поскольку вы говорите, что это занимает много времени, я подозреваю, что вы превысили емкость ОЗУ и начали использовать виртуальную память. Вы должны выключить систему, а затем перезапустить только R в качестве запущенного приложения и посмотреть, можно ли избежать "виртуального".
на data.table
устранение:
library(data.table)
dbsnp <- structure(list(snp = c("rs5", "rs6", "rs7", "rs8", "rs9", "rs10"
), gene = c("KRIT1", "CYP51A1", "LOC401387", "CDK6", "CDK6",
"CDK6"), distance = c(1L, 1L, 1L, 1L, 1L, 1L)), .Names = c("snp",
"gene", "distance"), class = "data.frame", row.names = c("rs5",
"rs6", "rs7", "rs8", "rs9", "rs10"))
DT <- data.table(dbsnp, key='snp')
features <- c('rs5', 'rs7', 'rs9')
DT[features]
snp gene distance
1: rs5 KRIT1 1
2: rs7 LOC401387 1
3: rs9 CDK6 1
используя sqldf
вам понадобится rownames = TRUE
затем вы можете запросить имена строк с помощью row_names
:
library(sqldf)
## input
test<-read.table(header=T,text=" snp gene distance
rs5 rs5 KRIT1 1
rs6 rs6 CYP51A1 1
rs7 rs7 LOC401387 1
rs8 rs8 CDK6 1
rs9 rs9 CDK6 1
rs10 rs10 CDK6 1
")
features<-c("rs5","rs7","rs10")
## calculate
inVar <- toString(shQuote(features, type = "csh")) # 'rs5','rs7','rs10'
fn$sqldf("SELECT * FROM test t
WHERE t.row_names IN ($inVar)"
, row.names = TRUE)
## result
# snp gene distance
#rs5 rs5 KRIT1 1
#rs7 rs7 LOC401387 1
#rs10 rs10 CDK6 1
обновление: поочередно, если fet
- это фрейм данных,features
столбец содержит необходимые элементы для поиска:
fet <- data.frame(features)
sqldf("SELECT t.* FROM test t
WHERE t.row_names IN (SELECT features FROM fet)"
, row.names = TRUE)
также, если данные были достаточно большими, мы могли бы ускорить его с помощью индексов. Вижу Домашняя страница sqldf для этого и другие детали.