【问题标题】:In R, extract the value of column 1 where subsequent columns are max在 R 中,提取第 1 列的值,其中后续列是最大值
【发布时间】:2015-01-24 16:19:27
【问题描述】:

我有一个 data.frame 包含 Time 作为第一列,然后每个后续列是单个细胞的转录因子的浓度,例如:

Time = c(0.1,0.2,0.3,0.4,0.5) 
Cell1 = c(1,5,10,4,2) 
Cell2 = c(1,5,4,11,5) 
Cell3 = c(1,9,5,9,5)
df = data.frame(Time,Cell1,Cell2,Cell3) 

得到:

     Time Cell1 Cell2 Cell3
1    0.1   1     1     1
2    0.2   5     5     9
3    0.3  10     4     5
4    0.4   4    11     9
5    0.5   2     5     5

现在,我正在尝试提取每个细胞具有最大转录因子浓度的时间,以输出如下内容:

Cell1 0.3
Cell2 0.4
Cell3 0.2,0.4

抱歉,如果这太简单化了,我是 R 新手,并且已经在论坛上摸索了一段时间以寻求答案。我可以通过单独查询每一列来做到这一点,但是我有数百个单元格,并且必须使用我当前的方法为每个单元格编写一个脚本:

cell1_peak=which(df[2]==max(df[2]));cell1_time=df$Time[cell1_peak]

可以通过我当前的方法使用 apply 函数并编译所有单元格以便于导出吗?

【问题讨论】:

    标签: r max apply


    【解决方案1】:

    试试

    apply(df[,-1], 2, function(x) 
               df$Time[x %in% max(x)])
    #$Cell1
    #[1] 0.3
    
    #$Cell2
    #[1] 0.4
    
    #$Cell3
    #[1] 0.2 0.4
    

    或者

     apply(df[,-1], 2, function(x)  toString(df$Time[x == max(x)]))
      #Cell1      Cell2      Cell3 
      #"0.3"      "0.4" "0.2, 0.4" 
    

    【讨论】:

      【解决方案2】:

      将您的数据转换为“长”格式,然后使用 R 中的众多聚合函数之一。

      这里有两种使用“data.table”的方法。

      首先,加载所需的包。

      library(data.table)
      library(reshape2)
      

      选项 1:保持数据较长 - 以后使用更灵活。 (我更喜欢这个选项。)从这里,如果你想使用paste 或其他方法折叠它,你可以使用dcast.data.table

      melt(as.data.table(df), id.vars = "Time")[, list(
        Time[value == max(value)]), by = variable]
      #    variable  V1
      # 1:    Cell1 0.3
      # 2:    Cell2 0.4
      # 3:    Cell3 0.2
      # 4:    Cell3 0.4
      

      选项 2:将结果存储为 list 列。与使用 paste 相比,在后期处理数据时提供了更大的灵活性,但没有多少人期望列是 list

      melt(as.data.table(df), id.vars = "Time")[, list(
        list(Time[value == max(value)])), by = variable]
      #    variable      V1
      # 1:    Cell1     0.3
      # 2:    Cell2     0.4
      # 3:    Cell3 0.2,0.4
      

      【讨论】:

      • 谢谢!我选择了您的第二个选项,因为我更喜欢它在同一行中提供具有多个时间点的单元格。我也会记下您的其他选项,以防日后引起问题。再次感谢您,非常简单的解释和简洁的输出。
      【解决方案3】:
      apply(df[,-1],2,function(x){
                         paste(df$Time[which(x==max(x))],collapse=",")
                       })
      

      给你这个:

      Cell1     Cell2     Cell3 
      "0.3"     "0.4" "0.2,0.4" 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-30
        • 1970-01-01
        • 2017-11-15
        • 1970-01-01
        • 2020-01-27
        • 2019-11-22
        • 2018-06-10
        • 2018-11-02
        相关资源
        最近更新 更多