2016-06-26 4 views
0

Вопрос довольно прост в использовании, но для реализации желаемой функции мне кажется слишком сложным.
Я хочу иметь функцию, которая дает мне все строки data.frame, которые являются за исключением n столбцов. Другими словами: функция, которая дает мне почти дублированные строки (в этих строках разрешено различать только n записей).R: duplicated() с подстановочными знаками

Here Я нашел некоторые данные, которые очень похожи на мои данные. Я использовал первые два ряда этих данных, чтобы произвести мой пример данных:

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") 

Моя попытка написать функцию, которая делает то, что я хочу, закончилось так:

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 находит только дублированные строки 3 и 5, но не ряд 4, который он также должен был найти, для wildcards >= 4.


Ибо кто заинтересован в какой-то дополнительной справочной информации: Я получил два data.frames, которые разделяют некоторые выборки, но один из data.frames имеет значение, меньшее, чем предел обнаружения заменен половины предела обнаружения (как в случае для строк 4 и 5 в моем примере). Мне нужно объединить те data.frames и удалить все дублированные сэмплирования (строки).

ответ

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))])) 
    } 
} 
Смежные вопросы