在external()函数中确定完全相等

时间:2019-01-25 16:51:31

标签: r

请运行以下代码:

list2env(list(df1 = iris, df2 = iris, df3 = CO2, df4 = CO2, df5 = cars), .GlobalEnv)

它将在您的工作区中创建5个data.frame对象 df1〜df5

  • df1 = df2 = iris
  • df3 = df4 = CO2
  • df5 = cars(它们是R中的内置数据集。)

现在,我正在尝试使用identical()all.equal()来确定哪对对象相等。首先,我选择对象名称:

name_df <- ls(pattern = "^df") # [1] "df1" "df2" "df3" "df4" "df5"

预期输出是这样的表:

#       df1    df2    df3    df4    df5
# df1   TRUE   TRUE   FALSE  FALSE  FALSE
# df2   TRUE   TRUE   FALSE  FALSE  FALSE
# df3   FALSE  FALSE  TRUE   TRUE   FALSE
# df4   FALSE  FALSE  TRUE   TRUE   FALSE
# df5   FALSE  FALSE  FALSE  FALSE  TRUE 

但是实际上,我认为我不需要使用tidyverse。在这种情况下,基函数outer()可能更合适。但是,无论我如何修改,以下代码始终会出错。(我已经尝试Vectorize()的每个参数identical(),但仍然无法正常工作

outer(name_df, name_df, function(x, y){
  identical(get(x), get(y))
# Vectorize(identical)(get(x), get(y))
})

感谢帮助!

1 个答案:

答案 0 :(得分:3)

我们可以在函数上加上Vectorize

f1 <- Vectorize(function(x, y) identical(get(x), get(y)))
outer(name_df, name_df, f1)
#     [,1]  [,2]  [,3]  [,4]  [,5]
#[1,]  TRUE  TRUE FALSE FALSE FALSE
#[2,]  TRUE  TRUE FALSE FALSE FALSE
#[3,] FALSE FALSE  TRUE  TRUE FALSE
#[4,] FALSE FALSE  TRUE  TRUE FALSE
#[5,] FALSE FALSE FALSE FALSE  TRUE

或将tidyversecrossing一起使用

library(tidyverse)
crossing(name_df, name_df) %>% 
   mutate(Equal = map2_lgl(mget(name_df, envir = .GlobalEnv), 
                          mget(name_df1, envir = .GlobalEnv), 
             identical)) %>% 
   spread(name_df1, Equal) %>%
   column_to_rownames('name_df')