对于所有的大师程序员来说,这可能非常简单,但我是R的新人,我寻求一些帮助。首先,我将尝试描述我的数据然后提出问题。 我有110k的障碍物。 24个变量:
qseqid evalue pident lenght .......
1 LL_206 3e-22 65.7 612
2 LL_206 5e-22 75.6 485
3 LL_206 5e-14 80.6 598
4 LL_300 4e-22 90.5 251
5 LL_300 4e-22 64.7 589
6 LL_300 8e-14 89.8 125
.
.
.
现在您可以看到我的数据在qseqid变量中有子集。我想从我的数据中得到的是为qseqid变量的每个子集找到最小值,最大值和最大长度。
我的结果应如下所示:
qseqid evalue pident lenght .......
1 LL_206 3e-22 65.7 612
2 LL_300 4e-22 90.5 251
.
.
.
我希望结果显示为csv表,并且表中也应包含所有变量。 我尝试了聚合方法,但我不知道如何告诉R找到第一个最小值,然后是max pident,依此类推。 非常感谢您的帮助。
答案 0 :(得分:0)
使用dplyr
的解决方案:
library(dplyr)
res <- group_by(your_data_frame, qseqid) %>%
summarise(evalue = min(evalue), pident = max(pident),
length = max(length))
然后,您可以使用res
/ write.csv
保存write.csv2
。
答案 1 :(得分:0)
我能想到的方法是创建一个函数,它使所有行的子集满足第一个要求,然后是第二个子集,依此类推。
ComplexSubset <- function(id){
data.t <- data[data$qseqid %in% id,] # subset the needed qseqid
data.t <- data.t[data.t$eval %in% min(data.t$eval),] # subset the ALL min eval
data.t <- data.t[data.t$pident %in% max(data.t$pident),] # subset ALL max pident
data.t <- data.t[data.t$lenght %in% max(data.t$lenght),] #subset ALL max lenght
#here you can add additional subseting for your remaining colums
return(data.t) ## save the row ID
}
## And then run for all unique qseqid
data.final <- data[0,]
for(id in unique(data$qseqid)){
data.final <- rbind(data.final, ComplexSubset(id))
}
这应该有效。 希望它有用
答案 2 :(得分:0)
好的,这不是我想要的100%输出。但它已接近......
qseqid <- c("LL_1", "LL_1", "LL_1", "LL_1", "LL_2", "LL_2", "LL_2", "LL_2")
evalue <- c(1e-34, 1e-34, 1e-34, 1e-25, 2e-85, 2e-85, 3e-85, 1e-80)
pident <- c(90.5, 90.5, 80.8, 90.5, 75.3, 85.6, 75.3, 65.2)
lenght <- c(485, 503, 897, 1052, 689, 4859, 50, 115)
title <- c("A", "B", "C", "D", "E", "F", "G", "H")
mojadata <- data.frame(qseqid, evalue, pident, lenght, title)
数据:
qseqid evalue pident lenght title
1: LL_1 1e-34 90.5 485 A
2: LL_1 1e-34 90.5 503 B
3: LL_1 1e-34 80.8 897 C
4: LL_1 1e-25 90.5 1052 D
5: LL_2 2e-85 75.3 689 E
6: LL_2 2e-85 85.6 4859 F
7: LL_2 3e-85 75.3 50 G
8: LL_2 1e-80 65.2 115 H
代码:
mojadata = data.table (mojadata)
mojadataout<-mojadata[, list(evalue=min(evalue),
pident=max(pident[evalue == min(evalue)]),
lenght=max(lenght[pident==max(pident)&evalue==min(evalue)])),
by=list(qseqid)]
输出(我得到的):
qseqid evalue pident lenght
1: LL_1 1e-34 90.5 503
2: LL_2 2e-85 85.6 4859
输出(我想要的):
qseqid evalue pident lenght title
1: LL_1 1e-34 90.5 503 B
2: LL_2 2e-85 85.6 4859 F
现在,我如何输入输出变量&#34; title&#34;?我希望这次我的问题更容易理解。