请运行以下代码:
list2env(list(df1 = iris, df2 = iris, df3 = CO2, df4 = CO2, df5 = cars), .GlobalEnv)
它将在您的工作区中创建5个data.frame对象 df1〜df5 。
iris
CO2
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))
})
感谢帮助!
答案 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
或将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')