2016-07-16 5 views
0

R로 데이터 정리 및 처리 작업 중입니다. 복제본을 매트릭스에서 제거하고 싶습니다. 아래 예제를 참조하십시오. 두 개의 기준에 따라 중복을 제거하고 간격을 사용하여 가능하면 (동일한 행에 대해 RT ± 0.1 및 mz ± 0.001이 표에서 한 번 이상 감지되면 여분의 행을 제거하십시오).중복 제거 두 기준 간격 R

 RT  m.z 
1  2.02 326.1988 
2  2.03 326.1989 
3  2.06 326.1990 
4  2.03 331.1533 
5  2.03 375.1785 
6  2.03 301.2852 
7  2.04 301.2852 
8  2.06 301.2852 
9  2.07 357.2609 
10  2.07 308.0327 
11  2.08 218.2221 
12  2.08 312.3617 
13  2.10 473.3453 
14  2.15 388.3929 

내가 그런 식으로 넣어 아웃 싶습니다

 RT  m.z 
1  2.02 326.1988 
2  
3  2.06 326.1990 
4  2.03 331.1533 
5  2.03 375.1785 
6  2.03 301.2852 
7  
8  2.06 301.2852 
9  2.07 357.2609 
10  2.07 308.0327 
11  2.08 218.2221 
12  2.08 312.3617 
13  2.10 473.3453 
14  2.15 388.3929 

당신이 나에게 많은 도움이 될 수 있도록 할 수 있습니다.

미리 감사드립니다.

+0

게시물에서 업데이트하십시오. – akrun

답변

0

이것은 dplyr으로 수행하는 방법입니다. 그것이 가장 효율적인 방법인지 확실하지 않습니다.

df <- read.table(textConnection("RT  m.z 
1  2.02 326.1988 
            2  2.03 326.1989 
            3  2.06 326.1990 
            4  2.03 331.1533 
            5  2.03 375.1785 
            6  2.03 301.2852 
            7  2.04 301.2852 
            8  2.06 301.2852 
            9  2.07 357.2609 
            10  2.07 308.0327 
            11  2.08 218.2221 
            12  2.08 312.3617 
            13  2.10 473.3453 
            14  2.15 388.3929")) 

귀하가 제공 한 동일한 데이터를 사용하십시오.

library(dplyr) 
# This calculates the difference in RT and m.z between consecutive rows 
# and looks for absolute differences on which we filter further down the chain 
df %>% mutate(
    rtdiff = abs(lag(RT) - RT), 
    mzdiff = abs(lag(m.z) - m.z) 
) %>% 
    # This replaces the NAs in the first row 
    # with large values so filter does not have to deal with NAs 
    mutate(rtdiff = replace(rtdiff, is.na(rtdiff), 999), 
     mzdiff = replace(mzdiff, is.na(mzdiff), 999)) %>% 
    # Remove the rows that don't meet your condition 
    filter(!(rtdiff < 0.02 & mzdiff < 0.0002)) %>% 
    # select only the columns you need and lose the rest 
    select(RT, m.z) 

우리에게주는 :

RT  m.z 
1 2.02 326.1988 
2 2.06 326.1990 
3 2.03 331.1533 
4 2.03 375.1785 
5 2.03 301.2852 
6 2.06 301.2852 
7 2.07 357.2609 
8 2.07 308.0327 
9 2.08 218.2221 
10 2.08 312.3617 
11 2.10 473.3453 
12 2.15 388.3929 
+0

그래, 내가 그 행렬을 정렬해야한다고 생각해. 사실 내가 당신에게 준 테이블은 그저 하나의 예일뿐입니다. 나는 그 행렬을 다음과 같은 함수로 정렬했다. \t'df = df [order (df $ m.z),]' 이제 코드를 사용하려고한다. 계속 알려 줄께. 감사합니다. – Vanbell

+0

이 답변이 도움이 되었다면, 가장 좋은 답을 표시하고 업 보트를 줄 수 있습니까? 감사. – Maiasaura

+0

추신 : 정렬 기능으로'dplyr'에서도 정렬 작업을 할 수 있습니다. – Maiasaura

0

안녕 내가 내 복제 사이의 값으로 삽입 된 것 같다.

그래서 나는 마이아사우라 코드의 작은 변화를 제안합니다.

for (i in 1:100){ 
    reduced.list.pre.filtering = reduced.list.pre.filtering %>% mutate(
    rtdiff = abs(lag(RT..min.,i) - RT..min.), 
    mzdiff = abs(lag(Max..m.z,i) - Max..m.z)) %>% 


    mutate(rtdiff = replace(rtdiff, is.na(rtdiff), 999), 
      mzdiff = replace(mzdiff, is.na(mzdiff), 999)) %>% 

    filter(!(rtdiff < setRT & mzdiff < setmz)) %>% 

select(RT..min., Max..m.z)} 

우리가 행의 모든 ​​후속 값을 검사하는 것과 같습니다. 다른 사람들에게 도움이되기를 바랍니다. 더 나은 해결책이 있다면 주저하지 마십시오.