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

时间:2016-10-03 08:16:25

标签: r dataframe apply sapply

我想得到两个数据帧之间不匹配的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的总数。有任何建议如何使这项工作?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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)

答案 2 :(得分:0)

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

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