代码之家  ›  专栏  ›  技术社区  ›  Darren Tsai

函数在outer()中标识完全相等

r
  •  2
  • Darren Tsai  · 技术社区  · 6 年前

    请运行此代码:

    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() 的每个参数 恒等式() 但还是不行)

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

    谢谢你的帮助!

    1 回复  |  直到 6 年前
        1
  •  3
  •   akrun    6 年前

    我们可以用 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
    

    或使用 tidyverse 具有 crossing

    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')