我有一个包含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函数并编译所有单元格以便于导出的可能方法?
答案 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"