Compare matrices to find the differences

后端 未结 2 1336
感动是毒
感动是毒 2020-12-22 12:02

I have 2 matrices, I want to compare them (row.name wise) to find the difference.

> head(N1)
              Total_Degree Transitivity Betweenness Closeness         


        
相关标签:
2条回答
  • 2020-12-22 12:23

    That is a part of the solution, in res you have a data.table to work with for the difference part:

    require(data.table)
    require(dplyr)
    
    set.seed(2016)
    dt1 <- data.table(V1 = c("a", "b", "c", "d"), V2 = rnorm(4))
    dt2 <- data.table(V1 = c("c", "d", "e", "f"), V2 = rnorm(4))
    
    # common <- merge(dt1, dt2, by = "V1")[, Unique := "Common"]
    # unique1 <- dt1[V1 %nin% dt2[, V1], ][, Unique := "N1"]
    # unique2 <- dt2[V1 %nin% dt1[, V1], ][, Unique := "N2"]
    # res <- rbind(common, unique1, unique2, fill = TRUE)
    

    Small update after @Cath answer, just for clarity.

    allMerged <- merge(dt1, dt2, by = "V1", all = TRUE) %>%
      .[, RowSum := rowSums(.SD, na.rm = TRUE), .SDcols = grep("V2", names(.))] %>%
      .[, Unique := ((is.na(V2.x) + 2*is.na(V2.y)))]
    
    print(allMerged)
    
    0 讨论(0)
  • 2020-12-22 12:35

    A way to go in base R, with rowSums and merge:

    If N1 and N2 are data.frames:

    # compute the row sums and merge N1 and N2
    N1$rs <- rowSums(N1, na.rm=TRUE)
    N2$rs <- rowSums(N2, na.rm=TRUE)
    comp <- merge(N1[, "rs", drop=FALSE], N2[, "rs", drop=FALSE], by="row.names", all=TRUE)
    
    # then compare the row sums and the variable "locations"
    comp$Unique <- with(comp, c("N1", "N2", "common")[(!is.na(rs.x)) + 2*(!is.na(rs.y))])
    comp$Comparison <- with(comp, rs.x-rs.y)
    
    # keep only the variable you need:
    comp <- comp[, c(1, 5, 4)]
    

    If N1 and N2 are matrices:

    # compute the row sums and merge N1 and N2
    rs1 <- rowSums(N1, na.rm=TRUE)
    rs2 <- rowSums(N2, na.rm=TRUE)
    comp <- merge(N1, N2, by="row.names", all=TRUE)
    
    # then compare the row sums and the variable "locations"
    comp$Unique <- with(comp, c("N1", "N2", "common")[as.numeric(!is.na(Total_Degree.x)) + 2*as.numeric(!is.na(Total_Degree.y))])
    comp$Comparison <- with(merge(as.data.frame(rs1), as.data.frame(rs2), all=TRUE, by="row.names"), rs1-rs2)
    
    # keep only the variable you need:
    comp <- comp[, c("Row.names", "Comparison", "Unique")]
    

    output of both methods:

    comp
    #      Row.names    Comparison Unique
    #1 2410016O06RIK  0.0000844042 common
    #2          ADI1            NA     N2
    #3          AGO1 -1.8332483856 common
    #4          AIRN            NA     N2
    #5         APEX1  3.0000856324 common
    #6           ATR  0.8334181369 common
    #7         CASP3            NA     N1
    #8         CCND2            NA     N1
    
    0 讨论(0)
提交回复
热议问题