在R中,提取第1列的值,其中后续列为max

时间:2014-11-26 11:02:41

标签: r max apply which

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

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函数并编译所有单元格以便于导出的可能方法?

3 个答案:

答案 0 :(得分:5)

将您的数据转换为“长”格式,然后使用R。

中的众多聚合函数之一

以下是“data.table”的两种方法。

首先,加载所需的包。

library(data.table)
library(reshape2)

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

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

答案 1 :(得分: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 :(得分:0)

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"