2016-06-26 8 views
0

質問は非常に簡単ですが、目的の機能を実装するのは私にとっては難しいようです。
data.frameのすべての行が、n列を除いて同じになるようにする関数が必要です。言い換えれば、私にほぼ複写された行を与える関数です(n個のエントリだけがそれらの行で異なることが許されます)。R:ワイルドカードを使った複製()

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

私の試み:私は私の例のデータを生成するために、このデータの最初の2つの行を使用しました複製された行3と5が、行4ではなく、wildcards >= 4の場合にも見つかるはずです。


いくつかのより多くの背景情報に興味がある人は誰でものために

:そうであるように、私はいくつかのサンプリングを共有する2つの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))])) 
    } 
} 
関連する問題