Понимание вывода all_equal - PullRequest
1 голос
/ 26 июня 2019

Я использовал dplyr::all_equal, чтобы попытаться найти различия между наборами данных. Я не всегда понимаю результат, когда наборы данных не равны.

Я сгенерировал несколько небольших кусочков, чтобы попытаться выявить смысл выводов, легко сравнивая их, но разные выводы меня смущают. Я посмотрел на документацию, и она не дает удовлетворительного объяснения для меня, потому что нет никаких подробностей, объясняющих, как результат объясняет различия помимо позиций. Примеры в документации на самом деле также не охватывают этот случай.

library(tidyverse)
set.seed(123)

df1 <- as_tibble(rpois(4, 2))
df2 <- as_tibble(rpois(4, 2))
df3 <- as_tibble(rpois(4, 2))
df4 <- as_tibble(rpois(4, 2))

df1
#> # A tibble: 4 x 1
#>   value
#>   <int>
#> 1     1
#> 2     3
#> 3     2
#> 4     4
df2
#> # A tibble: 4 x 1
#>   value
#>   <int>
#> 1     4
#> 2     0
#> 3     2
#> 4     4
df3
#> # A tibble: 4 x 1
#>   value
#>   <int>
#> 1     2
#> 2     2
#> 3     5
#> 4     2
df4
#> # A tibble: 4 x 1
#>   value
#>   <int>
#> 1     3
#> 2     2
#> 3     0
#> 4     4

all_equal(df1, df2)
#> [1] "Rows in x but not y: 1, 2. Rows in y but not x: 2. Rows with difference occurences in x and y: 4"
all_equal(df1, df4)
#> [1] "Rows in x but not y: 1. Rows in y but not x: 3. "
all_equal(df1, df3)
#> [1] "Rows in x but not y: 1, 2, 4. Rows in y but not x: 3. Rows with difference occurences in x and y: 3"
all_equal(df2, df3)
#> [1] "Rows in x but not y: 2, 1. Rows in y but not x: 3. Rows with difference occurences in x and y: 3"
all_equal(df2, df4)
#> [1] "Rows in y but not x: 1. Rows with difference occurences in x and y: 1"

Создано в 2019-06-26 пакетом представ. (v0.2.1)

Если бы кто-то спросил меня «Сколько наблюдений отличаются между двумя наборами», основываясь на вышеприведенных выходных данных, мой ответ был бы наибольшим числом строк, возвращаемых «Строки в __, но не __: число». Так, например, я бы сказал:

«Количество наблюдений между df1 и df3, которые отличаются, равно 3».

Это правильная идея? Кроме того, я не знаю, как интерпретировать «строки с различиями в части x и y: число», поскольку в all_equal(df1, df2) между наборами есть два разных наблюдения, но в строке 4 записи одинаковы.

1 Ответ

1 голос
/ 26 июня 2019

Мне недавно пришлось сделать нечто подобное для двойного ввода данных и использовать базу R. Не совсем то, что вы просили, но я надеюсь, что это поможет.Это может быть сделано проще в каждом конкретном случае (например, mapply(`==`, df1, df2)), но я адаптировал свой ответ к масштабированию для большого количества информационных фреймов, потому что вы упомянули наличие 4. В приведенном ниже коде тестируется каждый фрейм данных, построчно.ряд, для равенства.Имейте в виду, что это решение зависит от порядка (в отличие от all_equal), и если ваши кадры данных не имеют идентичных столбцов # / row #, вам придется адаптировать это решение, прежде чем оно станет жизнеспособным.Удачи!!!

library(tidyverse)
set.seed(123)

df1 <- as_tibble(rpois(4, 2))
df2 <- as_tibble(rpois(4, 2))
df3 <- as_tibble(rpois(4, 2))
df4 <- as_tibble(rpois(4, 2))

# Making a list of your dataframes 
df_list <- mget(ls(pattern = "df\\d"))

# Creating indices for the comparison (from df_list)
indices <- combn(seq_along(df_list), 2, simplify = F)

# Comparing all elements of the df_list
comparisons <- lapply(indices, function(x) mapply(`==`, df_list[x[1]], df_list[x[2]]))

# Cleaning up names
names(comparisons) <- sapply(indices, paste, collapse = " vs ")

head(comparisons, 2)
$`1 vs 2`
       df1
[1,] FALSE
[2,] FALSE
[3,]  TRUE
[4,]  TRUE

$`1 vs 3`
       df1
[1,] FALSE
[2,] FALSE
[3,] FALSE
[4,] FALSE

# Now, summarise it however you like, e.g.: Pct agreement
sapply(comparisons, mean)
1 vs 2 1 vs 3 1 vs 4 2 vs 3 2 vs 4 3 vs 4 
  0.50   0.00   0.25   0.00   0.25   0.25 

РЕДАКТИРОВАТЬ: вышеуказанное решение аналогично использованию all_equal(df, df, ignore_col_order = FALSE, ignore_row_order = FALSE)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...