将具有共同价值的行放入列表

时间:2018-04-27 13:33:34

标签: r bioinformatics

我正在尝试根据“区域类型”列中的值将行放入列表中,并将这些列表放入其他数据结构(向量或列表)中。 数据看起来像这样(约700 000行):

chr CS  CE  CloneName   score   strand  # locs per clone    # capReg alignments Type of region  
chr1    10027684    10028042    clone_11546 1   +   1   1   chr1_10027880_10028380_DNaseI
chr1    10027799    10028157    clone_11547 1   +   1   1   chr1_10027880_10028380_DNaseI
chr1    10027823    10028181    clone_11548 1   -   1   1   chr1_10027880_10028380_DNaseI
chr1    10027841    10028199    clone_11549 1   +   1   1   chr1_10027880_10028380_DNaseI

这是我试图做的事情:

typeReg=dat[!duplicated(dat$`Type of region`),]

for(i in 1:nrow(typeReg)){
    res[[i]]=dat[dat$`Type of region`==typeReg[i,]$`Type of region`,]
}

for循环耗费了太多时间,所以我尝试使用apply:

res=apply(typeReg, 1, function(x){
    tmp=dat[dat$`Type of region`==x[9],]
})

但它也很长(区域类型列中有30万个唯一值)。 你有解决我的问题的方法,或者它花了很长时间这是正常的吗?

2 个答案:

答案 0 :(得分:0)

您可以使用split()

type <- as.factor(dat$Type_of_Region)
split(dat, type)

但是,正如评论中所述,使用dplyr::group_by()可能是更好的选择,具体取决于您以后要做什么。

答案 1 :(得分:0)

好的,所以拆分有效,但是子集并没有降低我在df中的因子水平。所以基本上对于每个列表创建了分割函数,它在原始df中带来了300 000个级别,因此列表的大小很大。可能的解决方案是在创建的每个列表上使用droplevels()函数(如果一个列表太大而无法存储在RAM中,则不是最佳的),使用for循环(此解决方案非常慢)或删除导致a的列这就是我所做的问题。

res=split(dat[,c(-4,-9)], dat$`Type of region`, drop=TRUE)