在数据子集的不同变量中查找最小值和最大值

时间:2015-11-06 07:20:31

标签: r

对于所有的大师程序员来说,这可能非常简单,但我是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,依此类推。 非常感谢您的帮助。

3 个答案:

答案 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;?我希望这次我的问题更容易理解。