У меня есть кадр данных, который выглядит следующим образом:
SNP1 01010101000000100000010010001010011001010101
SNP2 01010010101000100000000000000001100001001000
SNP3 01010101000000000000000000000100011111111111
... но в действительности он содержит ~ 8 миллионов строк, и каждый двоичный вектор имеет длину 1000 каждый.
Мне нужно выбрать определенные c позиции в этих двоичных векторах (по всем строкам). Грязный способ сделать это - удалить имена строк, преобразовать каждый ди git в столбец, а затем создать объект, содержащий интересующие меня позиции.
С примерами данных хорошо работает следующее: но это не очень эффективно с моими реальными данными (это работает в течение длительного времени). Любые идеи, как я могу сделать это быстрее?
library(data.table)
library(stringr)
setwd("test/")
DATADIR="datadir/"
OUTPUTDIR="outputdir/"
dir.create(OUTPUTDIR, showWarnings = FALSE)
baseline<-read.table(paste0(DATADIR,"input.file"), colClasses = "character")
# Pass BP name to row name (so that I can split the binary vector into multiple columns)
row.names(baseline) <- baseline$V1
baseline$V1 <- NULL
# split cells containing the binary vectors into multiple columns - thank you @Onyambu for this!
baseline_new <- read.table(text = gsub('(.)','\\1 ',baseline$V2),fill=TRUE)
# select columns of interest
columns_to_keep <- c(1, 4, 8, 10)
baseline_new_ss <- baseline_new[, columns_to_keep]
# create new object containing a column with the original row names, then recreate binary vector based on subsetted binary positions.
baseline_final <- as.data.frame(row.names(baseline))
baseline_final$V2 <- as.character(interaction(baseline_new_ss,sep=""))
Вывод (выбирая только позиции 1, 4, 8 и 10) должен выглядеть следующим образом:
SNP1 0110
SNP2 0100
SNP3 0110
Я уверен, что есть меньше запутанный способ сделать это.
Спасибо !!