我有2个大小相等的数据框(例如A和B)(行和列)。我想输出一个相同大小的数据框,例如C,所有值都为0或1。

C[i,j] = 0, if A[i,j] != B[i,j]
C[i,j] = 1, if A[i,j] == B[i,j]

我不想使用循环或ifelse语句,因为我已经成功完成了该操作,但是需要很长时间。如果还有其他直接方法可以做到这一点,那将非常有帮助。谢谢

最佳答案

只需比较两个data.frame即可获得具有相同大小的matrix,并在单元格中显示一个逻辑以指示比较结果:

A <- mtcars
B <- mtcars

A == B

结果(仅显示第一行):
                     mpg  cyl disp   hp drat   wt qsec   vs   am gear carb
Mazda RX4           TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
Mazda RX4 Wag       TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
Datsun 710          TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
Hornet 4 Drive      TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

要从比较中获取data.frame,请使用:
C <- as.data.frame(A == B)

您可以使用以下事实:R中的TRUE == 1和FALSE == 0(根据OP的要求)将结果强制转换为整数:
as.data.frame(lapply(as.data.frame(A == B), as.integer))

乘以1(在另一个答案中建议)更漂亮,并且可能更有效(避免:
as.data.frame(1 * (A == B))

编辑++ [添加了基准;改进了基准以提高一致性]:

基于10 Mio的data.frame在不同答案之间的基准。行(约260 MB)...
library(microbenchmark)   # install.packages("microbenchmark")
library(data.table)

A <- data.frame(col1 = 1:1E7,
                col2 = rep(c("a string", "another string"), 1E7/2),
                col3 = 1:1E7,
                col4 = 1:1E7,
                col5 = rep(LETTERS[1:10],1E6),
                stringsAsFactors = FALSE)
B <- A
B[1,1]=100  # change one cell to create a copy of the data.frame

microbenchmark(DF.equals       = as.data.frame(A == B),
               DF.mult         = as.data.frame(1 * (A == B)),
               DF.map          = as.data.frame(Map(`==`, A, B)),
               matrix.equals   = A == B,
               matrix.mult     = 1 * (A == B),
               matrix.map      = do.call(cbind, Map(`==`, A, B)),  # causes a warning: duplicated levels in factors are deprecated
               list.map        = Map(`==`, A, B),                  # fast cause it does not construct a matrix but only vectors
               times = 100)

显示Map()函数是明显的赢家(在我的系统上),是其他变体的两倍到四倍,并且matrix的结果比data.frame快得多:
Unit: milliseconds
          expr      min       lq     mean   median       uq      max neval    cld
     DF.equals 627.2541 630.7565 654.0266 635.1831 678.8903 686.0753   100     e
      DF.mult  743.8531 751.7933 781.1876 796.2282 799.1881 848.2455   100      f
        DF.map 169.6967 170.5842 176.5944 171.5072 173.5665 223.3354   100 a
 matrix.equals 294.2570 297.5330 311.8095 299.8093 345.0827 351.9193   100   c
  matrix.mult  402.6166 406.5279 422.9322 408.3012 453.4484 602.2139   100    d
    matrix.map 206.2596 208.4230 217.8891 209.8968 211.4139 266.1867   100  b
      list.map 169.1922 170.5403 175.7539 171.4602 173.3891 224.7062   100 a

BTW:

我真正喜欢的是现在如何进行一些统计。 G。计算每列(如果您使用rowSums,则为行)的不匹配数:
colSums(C != TRUE)

要么
colSums(A != B)

获得可用于自动检查前提条件的结果(例如,不允许出现不匹配):
 mpg  cyl disp   hp drat   wt qsec   vs   am gear carb
   0    0    0    0    0    0    0    0    0    0    0

关于r - 比较R中两个大小相等的数据帧中每个单元是否相等,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41790445/

10-16 11:18