我需要比较两个解释相同内容的数据帧,但它们来自不同的方式来获取它们。
所以我需要获得一个df,其中每个单独的值与另一个df上的相应值进行比较,如果值相同则给我TRUE,如果它们不是,则为FALSE。
我写一个例子只是为了更好地解释:
DF1
> 1 2 3
> 1 AT GC CC
> 2 AG GC CT
> 3 GG TT <NA>
DF2
> 1 2 3
> 1 AT <NA> GG
> 2 AG GC CG
> 3 GG TT AA
结果
> 1 2 3
> 1 TRUE <NA> FALSE
> 2 TRUE TRUE FALSE
> 3 TRUE TRUE <NA>
我在这里看到了一个结果
Comparing two similar dataframes and finding different values between them
但在我的df中,如果其中一个df有NA(R给我TRUE),则不起作用。
另外,我认为如果我在mapply()
中更改df的顺序,我将获得相同的结果,但在我的情况下它不正确。数据框也有不同的级别,因此df1==df2
无效。
我也会问你如何计算结果中的FALSE。是否有类似is.na()
的内容?
谢谢大家
答案 0 :(得分:2)
我们可以使用==
来获取逻辑矩阵
(df1 == df2) & !is.na(df1) & !is.na(df2)
# 1 2 3
#1 TRUE FALSE FALSE
#2 TRUE TRUE FALSE
#3 TRUE TRUE FALSE
如果列是factor
类,那么我们可以将colwise与mapply/Map
进行比较
mapply(function(x, y) {i1 <- as.character(x)==as.character(y)
replace(i1, is.na(i1), FALSE)}, df1, df2)
或者比较为matrix
,然后将NA转换为FALSE
m1 <- as.matrix(df1) == as.matrix(df2)
m1[is.na(m1)] <- FALSE
答案 1 :(得分:1)
另一种可能的选择,
df1 == replace(df2, is.na(df2), 'NA')
或如果两个数据帧都包含NA,
replace(df1, is.na(df1), 'NA') == replace(df2, is.na(df2), 'NA')