【问题标题】:Get rows with common value into lists将具有共同值的行放入列表中
【发布时间】:2018-04-27 13:33:33
【问题描述】:

我正在尝试根据“区域类型”列中的值将行放入列表中,并将这些列表放入其他数据结构(向量或列表)中。 数据如下所示(~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],]
})

但它也很长(区域类型列中有 300 000 个唯一值)。 您对我的问题有解决方案吗?或者需要这么长时间是正常的吗?

【问题讨论】:

  • 听起来像你想要的res = split(dat, dat$`Type of region`)
  • apply 用于矩阵上的行(或列)操作。在数据框上使用并不是很好(首先发生的事情是将您的 df 转换为矩阵,丢失列之间的所有类差异),然后它将按行操作(使用您的 MAR = 1 参数)。您不想在每个单独的行上运行一个函数,您想获取子集,所以apply 并没有真正解决这个问题。
  • 我还想知道您是否真的需要在下一步之前拆分数据。如果您共享您的目标,那么可能有比将这些数据复制到列表中,然后再次将其复制到其他结构中更好的方法。
  • 你没有说你为什么要这样做,但你很有可能可以通过使用 dplyr 包中的 group_by 来避免它
  • 所以我的数据框中还有很多其他列,我没有显示,因为我认为我不相关。但基本上,我计算了每一行的 p 值,现在我想为每种类型的区域都有一个最大似然估计。因此,合乎逻辑的步骤是获取每种区域类型的行

标签: r bioinformatics


【解决方案1】:

你可以使用split():

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

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

【讨论】:

  • 我认为 split 方法在这里不可用,因为生成的对象是 1309 Go(我觉得这很奇怪)。虽然根据文档我认为这个对象是我想要的
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2018-08-07
    • 2020-10-27
    相关资源
    最近更新 更多