2012-09-11 6 views
1

나는 data.frame을 읽을 때 키워드 사이의 유사점이 매우 큰 csv 파일 (약 9100 만 행, for 루프는 R에서 너무 오래 걸림)이 있습니다. 그것은 스파 스 목록 내가 스파 스 매트릭스로 변환하고자하는CSV를 R의 희소 행렬로 변환하는 효율적인 방법

> df 
kwd1 kwd2 similarity 
a b 1 
b a 1 
c a 2 
a c 2 

:처럼 보이는

> myMatrix 
    a b c 
a . 1 2 
b 1 . . 
c 2 . . 

나는 인덱스 소요를 정수로 키워드 이름을 희소 행렬()를 사용하지만, 변환 시도 너무 많은 시간.

도움 주셔서 감사합니다.

+0

왜 당신은 당신의 질문에 * 가능한 중복 * 헤더를해야합니까? –

+0

다른 게시물에서 온 것입니다. 죄송합니다. – rfoley

답변

1

acastreshape2 패키지에서 이렇게하면 좋을 것입니다. 기본 R 솔루션이 있지만 구문을 훨씬 더 어렵게 찾습니다.

library(reshape2) 
df <- structure(list(kwd1 = structure(c(1L, 2L, 3L, 1L), .Label = c("a", 
"b", "c"), class = "factor"), kwd2 = structure(c(2L, 1L, 1L, 
3L), .Label = c("a", "b", "c"), class = "factor"), similarity = c(1L, 
1L, 2L, 2L)), .Names = c("kwd1", "kwd2", "similarity"), class = "data.frame", row.names = c(NA, 
-4L)) 

acast(df, kwd1 ~ kwd2, value.var='similarity', fill=0) 

    a b c 
a 0 1 2 
b 1 0 0 
c 2 0 0 
> 

Matrix 패키지에서 sparseMatrix를 사용하여 :

library(Matrix) 
df$kwd1 <- factor(df$kwd1) 
df$kwd2 <- factor(df$kwd2) 

foo <- sparseMatrix(as.integer(df$kwd1), as.integer(df$kwd2), x=df$similarity) 

> foo 
3 x 3 sparse Matrix of class "dgCMatrix" 


foo <- sparseMatrix(as.integer(df$kwd1), as.integer(df$kwd2), x=df$similarity, dimnames=list(levels(df$kwd1), levels(df$kwd2))) 

> foo 

3 x 3 sparse Matrix of class "dgCMatrix" 
    a b c 
a . 1 2 
b 1 . . 
c 2 . . 
+0

흠 나는 이것을 시도 할 것이다. 그러나 이것이 나에게 희소 행렬을 줄 것인가? 메모리는 0의 조밀 한 행렬을 허용하지 않습니다. – rfoley

+0

어쩌면 내가 사실로 떨어지면 드문 드문 일 것이다. – rfoley

+0

@RyanEFOley'sparseMatrix'에 대한 편집 내역보기 – Justin

관련 문제