在R中,提取第一列的值,其中后续列是最大值。

3

我有一个数据框,第一列是时间,然后每个随后的列是单个细胞转录因子的浓度,例如:

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]

可能的方法是使用我目前的方法和应用函数,并编译所有单元格以便轻松导出?
3个回答

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

方案二:将结果保存为list列。相比使用paste,更灵活地处理数据,但不是很多人期望的列类型。

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

谢谢!我选择了你的第二个选项,因为我更喜欢将具有多个时间点的单元格放在同一行中。我会记下你的另一个选项,以防这会在以后引起问题。再次感谢,非常简单易懂的解释和整洁的输出。 - Kevin

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" 

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" 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接