2016-06-26 3 views
0

질문은 아주 쉽지만 원하는 기능을 구현하는 것은 나에게 너무 어려운 것 같습니다.
n 개의 열을 제외하고는 모두 동일한 data.frame의 모든 줄을 제공하는 함수가 필요합니다. 다른 말로하면 : 나에게 거의 중복 된 행을 제공하는 함수 (n 개의 항목 만 해당 행에서 다를 수 있음).와일드 카드로 R : duplicated()

Here 데이터가 내 데이터와 매우 흡사합니다.

ulti.dup <- function(x, widlcards = NULL, ...){ 

    if(is.null(wildcards)){ 
    print(which(duplicated(x, ...))) 
    } else if(!is.numeric(wildcards)){ 
    stop("wildcards has to be the maximum number of not matching columns and though numeric") 
    } else{ 
    comb <- combn(1:ncol(x), m = wildcards, simplify = FALSE) 
    dups <- c() 
    for(col in comb){ 
     dups <- c(dups, which(duplicated(x[, -col], ...))) 
    } 
    print(dups[-which(duplicated(dups))]) 
    } 
} 

그러나, ulti.dup 만 발견 : 나는 그렇게 끝났다 원하는 것을하는 함수를 작성하는

gw <- structure(list(TIME = structure(c(2L, 1L, 2L, 2L, 1L), .Label = c("05.12.2000", 
                     "26.07.2000"), class = "factor"), GAUGE_ID = c(198L, 200L, 198L, 
                                 198L, 200L), PH = c(7.22, 7.2, 7.22, 7.22, 7.2), EH = c(100L, 
                                               470L, 100L, 100L, 470L), CON = c(595L, 672L, 595L, 595L, 672L 
                                               ), TEMP = c(9.1, 10, 9.1, 9.1, 10), O2MG = c(0, 3.8, 0, 0.005, 
                                                          3.8), NH4 = c(0.24, 0.06, 0.24, 0.24, 0.06), NH4N = c(0.19, 0.05, 
                                                                        0.19, 0.19, 0.05), PO4 = c(0.061, 0.031, 0.061, 0.061, 0.031), 
         OPO4P = c(0.02, 0.01, 0.02, 0.02, 0.01), SAK = c(9.8, 11.3, 
                     9.8, 9.8, 11.3), CL = c(22.76, 18.49, 22.76, 22.76, 18.49 
                     ), BR = c(0, 0.06, 0, 0.015, 0.06), NO2 = c(0, 0.06, 0, 0.005, 
                                0.06), NO3 = c(0.02, 46.61, 0.02, 0.015, 46.61), SO4 = c(39.91, 
                                              60.17, 39.91, 39.91, 60.17), NA. = c(8.19, 8.34, 8.19, 8.19, 
                                                       8.34), K = c(3.23, 1.03, 3.23, 3.23, 1.03), MG = c(4.21, 
                                                                    7.82, 4.21, 4.21, 7.82), CA = c(110.72, 115.77, 110.72, 110.72, 
                                                                            115.77), DOC = c(4.67, 7.9, 4.67, 4.67, 7.9), FE2 = c(1.62, 
                                                                                          0.12, 1.62, 1.62, 0.12), MN = c(NA, NA, NA, NA, NA), HCO3 = c(5.11, 
                                                                                                         5.05, 5.11, 5.11, 5.05)), .Names = c("TIME", "GAUGE_ID", 
                                                                                                                  "PH", "EH", "CON", "TEMP", "O2MG", "NH4", "NH4N", "PO4", "OPO4P", 
                                                                                                                  "SAK", "CL", "BR", "NO2", "NO3", "SO4", "NA.", "K", "MG", "CA", 
                                                                                                                  "DOC", "FE2", "MN", "HCO3"), row.names = c(NA, 5L), class = "data.frame") 

내 시도 : 내 예를 들어 데이터를 생성하기 위해 데이터의 처음 두 행을 사용 중복 된 행 3과 5는 있지만 행 4는 찾지 못했습니다. wildcards >= 4에 대한 것입니다.


좀 더 배경 정보에 관심이 누구든지

:의 경우와 같이 좀 샘플링을 공유하는 두 data.frames를 얻었으나 data.frames 중 하나가 (검출 한계의 절반으로 대체 검출 한계보다 작은 값이 행 4와 5에 대한 예제). 난 그 data.frames 병합하고 모든 중복 samplings (행)을 제거해야합니다.

답변

0

좋아요, 내 질문에 제공되는 기능에 작은 오타가있는 것 같습니다. 아직 알지 못합니다. 내 작업 영역에 다른 개체 wildcards이 있었기 때문입니다. 매우 느리지 만 작동하는 코드는 다음과 같습니다.

ulti.dup <- function(x, wildcards = NULL, ...){ 

    if(is.null(wildcards)){ 
    print(which(duplicated(x, ...))) 
    } else if(!is.numeric(wildcards)){ 
    stop("wildcards has to be the maximum number of not matching columns and though numeric") 
    } else{ 
    comb <- combn(1:ncol(x), m = wildcards, simplify = FALSE) 
    dups <- c() 
    for(col in comb){ 
     dups <- c(dups, which(duplicated(x[, -col], ...))) 
    } 
    print(sort(dups[-which(duplicated(dups))])) 
    } 
}