2016-10-03 67 views
0

我想要得到兩個數據幀之間不匹配的總數NA。 我發現得到這兩個向量的方式如下:使用兩個數據幀作爲輸入的函數

compareNA <- function(v1,v2) { 
    same <- (v1 == v2) | (is.na(v1) & is.na(v2)) 
    same[is.na(same)] <- FALSE 
    n <- 0 
    for (i in 1:length(same)) 
    if (same[i] == "FALSE"){ 
    n <- n+1 
    } 
    return(n) 
} 

可以說我有矢量ab比較它們時,我得到的結果是2

a <- c(1,2,NA, 4,5,6,NA,8) 
b <- c(NA,2,NA, 4,NA,6,NA,8) 
h <- compareNA(a,b) 
h 
[1] 2 

我的問題是:如何將這個函數應用於數據框而不是向量?

有作爲一個例子這datafames:

a2 <- c(1,2,NA,NA,NA,6,NA,8) 
b2 <- c(1,NA,NA,4,NA,6,NA,NA) 

df1 <- data.frame(a,b) 
df2 <- data.frame(a2,b2) 

我所期望的結果是5,因爲這是出現在DF2不在DF1 NA S中的總數。任何建議如何使這項工作?

回答

0

第三種方法(假設DF1的尺寸& DF2相同):

sum(sapply(1:ncol(df1), function(x) compareNA(df1[,x], df2[,x]))) 
# 5 
0

當兩個數據框具有相同的名稱時,強制使兩個數據框具有相同的列名並逐列比較會更容易。然後,您可以簡單地在列上使用循環,並通過應用您的函數來增加運行總數。

compareNA.df <- function(df1, df2) { 

    total <- 0 
    common_columns <- intersect(colnames(df1), colnames(df2)) 

    for (col in common_columns) { 

     total <- total + compareNA(df1[[col]], df2[[col]]) 

    } 
    return(total) 
} 

colnames(df2) <- c("a", "b") 

compareNA.df(df1, df2) 
+0

但是如果我有沒有相同的colnames dataframes,然後我要改變列的名稱? – mina

+1

@mina,或者省略'intersect'並確保列完全對齊。 –

+0

有一點,你需要一些規則來匹配列,這可以通過名稱(我在這裏使用的)和使用相交。另一種方法是添加一個'by'參數,比如'merge'函數或''dplyr''的'join'函數。你也可以按照上面羅馬所說的位置來匹配它們。 – Choubi

2

這是第二個想法。

xy1 <- data.frame(a = c(NA, 2, 3), b = rnorm(3)) 
xy2 <- data.frame(a = c(NA, 2, 4), b = rnorm(3)) 

com <- intersect(colnames(xy1), colnames(xy2)) 

sum(xy1[, com] == xy2[, com], na.rm = TRUE) 

如果你不想擔心列名(但你應該),你可以確保列完全對齊。在這種情況下,intersect步驟是多餘的。

sum(xy1 == xy2, na.rm = TRUE)