2017-01-25 3 views
0

2 개의 동일한 data.frames가있는 경우 R 다이제스트 함수가 동일한 결과를 반환해야한다고 가정합니다. 이 두 데이터 프레임을 고려하십시오. 인쇄시R에서 dplyr을 사용한 후에 data.frame의 다이제스트가 변경되는 이유는 무엇입니까?

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 

또는 비교 동일하다

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

I :

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

그러나 소화 기능이 상이한 결과를 리턴 발굴 기대 est 함수는 동일한 결과를 가져옵니다 !! 동일한 data.frames를 비교하는 더 좋은 방법이 있습니까?

답변

0

나는 왜 digest이 둘 사이에 다른지 알 수 없습니다. 바로 dplyr

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

digest(df3) 

으로 발생하지 않는다는 점을주의하는 것이 중요하다는 df4 <- df1[,1:2]digest이 동일하다는 것을주의하는 것이 재미있다하지만 세 번째 고유 한 값을

75f29cee80971220081372627632689f 

를 반환합니다.

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

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

와 "f111f4b3d65b8bc2569a4b79a821a6d8"다른 (공유) 해시 그것은 어떻게 R 핸들 함께 할 수있는 뭔가가 있어야합니다 : 난에 모두 df1df2에서 동일한 해시를 생성 할 수 있습니다 변수를 메모리에 저장하면서 변수를 생성합니다. 내 이해는 digest 내에서 해시 변수를 제공하지 않고 변수 자체의 해시입니다. 따라서 해시가 일치하도록 동일한 방식으로 변수를 생성하는 단계를 추가해야 할 수도 있습니다. 당신이 비교하는 다른 방법을 찾고 있다면

그러나, 나는 그것이 아무튼 기본적으로 dplyr

all_equal(df1, df2) 

반환 TRUE에서 all_equal을 제안하고 예 (좋은 수 있습니다 가장자리의 경우 일부 처리를 허용합니다 행이나 열이 재배치되는 경우주의).목표가 두 데이터 집합의 일치를 확인하는 것일 경우 digest

+0

고마워요! 'all_equal()'은 지금 트릭을해야합니다! Axeman이 지적한대로 속성 순서가 변경 되었기 때문에 data.frame 슬라이싱이 도움이 될 것입니다. – 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

이것은 재미 있습니다! Mark Peterson (다른 대답)은 data.frames를 분할 한 후 동일한 해시를가집니다. 이것은 아마도 같은 순서로 속성을가집니다! 고맙습니다! – Mathias

관련 문제