应用具有两个数据帧的函数作为 r 中的输入

apply a function with two dataframes as input in r

我想获得两个数据帧之间不匹配的 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

我的问题是:如何将此函数应用于数据帧而不是向量?

以这个数据名为例:

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 的总数。关于如何使这项工作有任何建议吗?

强制两个数据框具有相同的列名并在它们具有相同的名称时逐列比较会更容易。然后,您可以简单地在列上使用循环并通过应用您的函数来增加 运行 总数。

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)

这是第二个想法。

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)

第三种方式(假设 df1 和 df2 的尺寸相同):

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