2017-03-01 1 views
2

아래에 표시된 User1 FOLLOWS User 2 형식으로 약 20 억 개의 지향 에지가있는 4GB 파일이 있습니다.매우 큰 모서리 목록에서 단방향, 양방향 링크 수를 신속하게 계산합니다.

User1  User2 
7   37 
5   24 
7   8383932 
24   1 
3   8538 
37   7 

DF = structure(list(User1 = c(7L, 5L, 7L, 24L, 3L, 37L), User2 = c(37L, 
24L, 8383932L, 1L, 8538L, 7L)), .Names = c("User1", "User2"), row.names = c(NA, 
-6L), class = "data.frame") 

등등. 내가 효율적으로 NumberFollowers은 "사용자 1"의 그들에 대한 링크의 수를 다음과 같은 결과

User  NumberFollowers  NumberFriends 
1   1      0 
7   1      1 
24   1      0 
37   1      1 
8383932  1      0 
8538  1      0 
5   0      0 
3   0      0 

등을 얻을 수 있기를 원하고 NumberFriends은 추종자의 수입니다 그들은 그 또한이 서로 따라라.

나는 현재

aggregate() 

그러나 사용자 5 및 사용자에는 친구 나 추종자가없는 3 같은 경우를 무시하는 것 같다 사용했지만, 그들 자신은 사람을 따릅니다.

내가 가지고있는 가장자리의 수를 영원히 감당할 수 있기 때문에 전체를 반복하지 않아도됩니다.

상대적으로 빠르고 고통없이 이렇게 좋은 방법이 있습니까?

감사합니다.

+0

나는 이런 것들을 위해 설계된 igraph를 사용해야한다고 생각합니다. – Frank

+0

출력이 잘못되었습니다. 37 친구가있다 (7). – Frank

+0

고마워, 나는 그것을 고쳤다. iGraph에서 고유 사용자 ID를 유지하면서 친구/팔로어 목록을 제공 할 수 있으므로이 데이터를 다른 데이터 세트와 상호 참조 할 수 있습니까? – Jibril

답변

5

여기에 한 가지 방법입니다 :

library(data.table) 
setDT(DT) 

res0 <- rbind(
    DT[, .N, by=.(user=User2)][, lab := "followers"], 
    DT[.(User2, User1), on=names(DT), nomatch=0][, .N, by=.(user=User2)][, lab := "friends"] 
)[, dcast(.SD, user ~ lab, value.var = "N", fill = 0L)] 

     user followers friends 
1:  1   1  0 
2:  7   1  1 
3:  24   1  0 
4:  37   1  1 
5: 8538   1  0 
6: 8383932   1  0 

이 더 추종자 사용자를 제외하지만 원하는 경우 다시 추가 할 매우 간단입니다.

DT 자체가 팔로어를 나열합니다. DT[.(User2, User1), on=names(DT), nomatch=0] 님은 친구 목록에 있습니다.

이 수치는이 데이터를 표 형식으로 처리 할 수있는 한계에 가깝습니다. 어떤 것이 더 좋고 당신은 정말로 그래프를 원할 것입니다. igraph 패키지를 참조하십시오.


모듬 주 :

  • DT[i,j,by]는 서브셋 i 수단을 사용하여 구; group by by; do j. ?data.table을 참조하십시오.
  • 작업은 DT[...][...]과 같이 연결될 수 있습니다.
  • :=은 열에 지정하는 특수 기호입니다.
  • .N은 그룹의 행을 계산하는 특수 변수입니다. ?.N을 참조하십시오.
  • on=nomatch=?data.table에 "join"에 i을 사용할 때 도우미 인수입니다.
  • dcast은 긴 형식에서 넓은 형식으로 변경하기위한 도우미 함수입니다. ?dcast을 참조하십시오.
+1

와우, 이건 실제로 내가 한 일에 비해 번개가 빠릅니다. 감사! 나는 신분증의 전체 목록을 추종자들과 함께 ID 목록과 비교할 것이며, 아무에게도 0을 붙이지 않는 사람이라면 누구든지 비교할 것입니다. 다시 한 번 감사드립니다. – Jibril

관련 문제