我有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/