我有一个看起来像这样的数据框:
snP1 01010101000000100000010010001010011001010101
snP2 01010010101000100000000000000001100001001000
snP3 01010101000000000000000000000100011111111111
...但是实际上它包含约800万行,每个二进制矢量的长度均为1000。
我需要在这些二进制向量中(跨所有行)选择特定位置。我发现这样做的肮脏方法是删除行名,将每个数字转换为一列,然后创建一个包含我感兴趣的位置的对象。
下面的示例数据可以很好地工作,但是对于我的真实数据却不是很有效(现在已经运行了很长时间)。有什么想法可以使它更快吗?
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
我敢肯定,这样做的方法比较简单。
谢谢!