Функция в external () для определения точного равенства - PullRequest
0 голосов
/ 25 января 2019

Пожалуйста, запустите этот код:

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 голосов
/ 25 января 2019

Мы можем обернуть с 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...