2017-01-25 1 views
0

Я предполагаю, что если у меня есть 2 идентичных кадра данных, функция дайджеста R должна вернуть тот же результат. Рассмотрим эти два кадра данных.Почему дайджест data.frame изменился после использования dplyr в R?

library(digest) 
library(dplyr) 
df1 <- tibble(a =1:5, b=11:15) 
df2 <- df1 %>% 
     mutate(c=b-1) %>% 
     select(-c) 

Оба data.frames идентичны при печати,

> df1 
# A tibble: 5 × 2 
    a  b 
    <int> <int> 
1  1 11 
2  2 12 
3  3 13 
4  4 14 
5  5 15 

или по сравнению:

> df1 ==df2 
     a b 
[1,] TRUE TRUE 
[2,] TRUE TRUE 
[3,] TRUE TRUE 
[4,] TRUE TRUE 
[5,] TRUE TRUE 

Однако функция возвращает переваривать различные результаты:

> digest(df1) 
[1] "4f82aa1035792a0acf304242ce6ad3ec" 
> digest(df2) 
[1] "3b7e697af67e8e36ba9b59aef69db304" 

I ожидал бы est, чтобы получить тот же результат !! Есть ли лучший способ сравнить идентичные data.frames?

ответ

0

Я понятия не имею, почему digest отличается между двумя. Важно отметить, однако, что это не просто так с dplyr

df3 <- df1 
df3$c <- 1 
df3 <- df3[ ,-3] 

digest(df3) 

возвращает одну треть уникальное значение

75f29cee80971220081372627632689f 

Хотя интересно отметить, что digest из df4 <- df1[,1:2] то же самое. Я могу даже генерировать тот же хэш от обоих df1 и df2 с:

digest(df1[,1:2]) 
digest(df2[,1:2]) 

и другой (общий) хэш «f111f4b3d65b8bc2569a4b79a821a6d8» с

digest(as.data.frame(df1[,1:2])) 
digest(as.data.frame(df2[,1:2])) 

Он должен иметь что-то делать с тем, как R ручками создание переменной, поскольку она хранит ее в памяти. Я понимаю, что digest не дает хеш значения в пределах переменной, а скорее хешей самой переменной. Таким образом, вам может потребоваться добавить шаг, который генерирует переменную таким же образом, чтобы согласовать хеши.

Однако, если вы ищете другой способ сравнения, я предлагаю all_equal от dplyr

all_equal(df1, df2) 

возвращает TRUE и позволяю некоторой обработку крайних случаев, которые могут быть хорошо (например, по умолчанию это Безразлично Не беспокойтесь, если строки или столбцы перегруппированы).Если ваша цель - просто проверить соответствие двух наборов данных, это, вероятно, «лучший» способ, чем борьба с digest

+0

Спасибо! 'All_equal()' должен сделать трюк на данный момент! Нарезка data.frame, вероятно, помогает, потому что порядок атрибутов изменяется, как указал Axeman. – Mathias

0

Я не знаю много о digest, но порядок attributes изменился, возможно, потому, что names получил обновленный в прошлом:

attributes(df1) 
$names 
[1] "a" "b" 

$class 
[1] "tbl_df"  "tbl"  "data.frame" 

$row.names 
[1] 1 2 3 4 5 
attributes(df2) 
$class 
[1] "tbl_df"  "tbl"  "data.frame" 

$row.names 
[1] 1 2 3 4 5 

$names 
[1] "a" "b" 
+0

Это интересно! Марк Петерсон (другой ответ) получил тот же хэш после разрезания данных. Это, вероятно, получило атрибуты в одном порядке! Спасибо! – Mathias