【问题标题】:R: Obtain range and frequency within interval for each column?R:获取每列区间内的范围和频率?
【发布时间】:2020-07-11 20:14:08
【问题描述】:

我有大约 300 行,每行代表一个基因,大约 30 个类别作为列。我的数据集如下所示:

   Gene   bile_duct
1 ABCA2 -0.01319722
2 ABCA3 -0.06648552
3 ABCA5 -0.05049298

我正在尝试 1) 计算特定范围内基因的频率 [-3,-1] 每列 2) 列出上述范围内的基因。

我不确定如何处理 (2)。对于(1),我的方法不起作用,但它会尝试先剪切数据,然后将 lapply 与 range 函数一起使用:

breaks = seq(-3,-1, by=2)
cut_lineage <- lapply(lineage_genes[,-1],cut,breaks)
cut_lineage <- lapply(cut_lineage,range)

【问题讨论】:

  • 你有超过 2 列吗?
  • 值不会落入为显示的数据指定的breaks
  • 是的,我有 30 列和 300 行。每列都有属于中断的值。

标签: r lapply sapply


【解决方案1】:

你可以在base R试试这个解决方案:

#数据

Data2 <- structure(list(Gene = structure(1:3, .Label = c("ABCA2", "ABCA3", 
"ABCA5"), class = "factor"), bile_duct = c(-0.01319722, -0.06648552, 
-0.05049298), bile_duct2 = c(-0.01319722, -0.06648552, -0.05049298
)), class = "data.frame", row.names = c(NA, -3L))

#Function
cuts <- function(x,a,b)
{
  y<-ifelse(x>=a & x<=b,1,0)
  return(y)
}

cuts(-1.5,a = -3,b = -1)
#Apply function and create a copy of data
Data3 <- Data2
Data3[,-1] <- apply(Data2[,-1],2,cuts,a = -3,b = -1)

#Obtain sums for all columns
Sum <- colSums(Data3[,-1])
#Summary by gene
aggregate(.~Gene,data=Data3,FUN = sum,na.rm=T)

Sum
bile_duct bile_duct2 
         0          0 

聚合应该随着显示值数量的更多数据而变化:

   Gene bile_duct bile_duct2
1 ABCA2         0          0
2 ABCA3         0          0
3 ABCA5         0          0

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我们可以使用base R。如果我们想在单个窗口中获取值的范围,请使用&gt;&lt; 对数据进行子集化,然后在其上应用range

    lapply(lineage_genes[,-1], function(x) range(x[x >= -3 & x <=-1]))
    

    如果我们需要“基因”列表而不是子集值,则子集“基因”

    lapply(lineage_genes[,-1], function(x) lineage_genes$Gene[x >= 3 & x <= -1])
    

    在 OP 的代码中,我们返回带有 cut 的组,而不是实际的列值,它是 factor 类型。因此,range 应用于剪切组而不是值的子集

    【讨论】:

      【解决方案3】:

      以下行将在数据框中存储您想要的频率。

      freqs = data.frame(col = '', n = NA)
      for (i in 2:ncol(data)) {
          freqs = rbind(freqs, 
                      data.frame(
                              col = names(data[i]), 
                              n = nrow(data[which(data[,i] >= -3 & data[,i] <= -1), ])
                          )
                      )
      }
      freqs = freqs[-1,]
      

      以下几行会将实际基因存储在一个列表对象中。列表对象中的每一项都用于其中一列。

      lists = vector('list', ncol(data)-1)
      
      for (i in 2:ncol(data)) {
      
          lists[[i]] = data[which(data[,i] >= -3 & data[,i] <= -1), 1]
      
      }
      

      如果您对每列使用的条件不同,则这些条件将不起作用。

      【讨论】:

        猜你喜欢
        • 2019-02-11
        • 2021-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-28
        • 1970-01-01
        • 1970-01-01
        • 2020-10-23
        相关资源
        最近更新 更多