2012-12-13 76 views
4

我有一個很大的數據框。出於某些目的,我需要做到以下幾點:查找數據框中所有列的重複組除外

在這個數據幀
  • 迭代上除選定列給定的數據幀的所有行
    • 選擇一列
    • 選擇此數據幀是所有行除了一個選定的列以外的所有元素相等
    • 通過組名稱是行索引的方式對它們進行分組,並且組值是重複行的索引。

    我已經爲此任務寫了一個函數,但是由於嵌套循環它工作緩慢。我想了解一下如何改進這些代碼。

    假設我們有這樣一個數據幀:

    V1 V2 V3 V4 
    1 1 2 1 2 
    2 1 2 2 1 
    3 1 1 1 2 
    4 1 1 2 1 
    5 2 2 1 2 
    

    我們希望能夠得到這個列表作爲輸出:

    diff.dataframe("V2", conf.new, conf.new) 
    

    輸出繼電器:

    $`1` 
    [1] 1 
    
    $`2` 
    [1] 2 
    
    $`3` 
    [1] 1 3 
    
    $`4` 
    [1] 2 4 
    
    $`5` 
    [1] 5 
    

    下面的代碼reaces目標,但它工作得太慢了。以某種方式改進它有可能嗎?

    diff.dataframe <- function(param, df1, df2){ 
        excl.names <- c(param) 
        df1.excl <- data.frame(lapply(df1[, !names(df1) %in% excl.names], as.character), stringsAsFactors=FALSE) 
        df2.excl <- data.frame(lapply(df2[, !names(df2) %in% excl.names], as.character), stringsAsFactors=FALSE) 
        list.out <- list() 
    
        for (i in 1:nrow(df1.excl)){ 
        for (j in 1:nrow(df2.excl)){ 
         if (paste(df1.excl[i,],collapse='') == paste(df2.excl[j,], collapse='')){ 
          if (!as.character(i) %in% unlist(list.out)){                                
          list.out[[as.character(i)]] <- c(list.out[[as.character(i)]], j)                          
          } 
         } 
        } 
        } 
        return(list.out) 
    } 
    
  • +2

    我認爲你的功能有效,但你想提高速度,對不對?我無法弄清楚如何運行它,所以如果你能提供一個小的示例數據集和我們可以驗證我們的解決方案的期望輸出將會很有幫助。粘貼'dput(df1)','dput(df2)'的輸出並顯示該功能的呼叫。 – Backlin

    +0

    請發佈樣本數據和預期結果。 – Andrie

    +0

    第1行如何與第3行匹配,但第3行與第1行不匹配? – Backlin

    回答

    1

    讓我們產生第一

    df <- as.data.frame(matrix(sample(2, 20, TRUE), 5)) 
    
    # Produces df like this 
        V1 V2 V3 V4 
    1 2 1 1 1 
    2 2 1 2 2 
    3 1 1 2 2 
    4 1 2 1 1 
    5 1 2 1 1 
    

    然後我們遍歷與lapply線的一些數據。然後將每行idfapply(包括其本身)的所有行進行比較。具有< = 1的行的差異返回TRUE,其他返回FALSE產生邏輯向量,我們使用which將其轉換爲數字向量。

    lapply(1:nrow(df), function(i) 
        apply(df, 1, function(x) which(sum(x != df[i,]) <= 1))) 
    
    # Produces output like this 
    [[1]] 
    [1] 1 
    
    [[2]] 
    [1] 2 3 
    
    [[3]] 
    [1] 2 3 
    
    [[4]] 
    [1] 4 5 
    
    [[5]] 
    [1] 4 5 
    
    相關問題