NA 기본 항목이있는 희소 행렬 생성 (및 액세스)
-
16-09-2019 - |
문제
에 대해 알게 된 후 r에서 드문 매트릭스로 작업하기위한 옵션, 나는 사용하고 싶다 행렬 다음 데이터 프레임에서 드문 매트릭스를 생성하고 다른 모든 요소가있는 패키지 NA
.
s r d
1 1089 3772 1
2 1109 190 1
3 1109 2460 1
4 1109 3071 2
5 1109 3618 1
6 1109 38 7
평소와 같이 요소에 액세스하는 다음과 같은 희소 행렬을 만들 수 있다는 것을 알고 있습니다.
> library(Matrix)
> Y <- sparseMatrix(s,r,x=d)
> Y[1089,3772]
[1] 1
> Y[1,1]
[1] 0
그러나 기본값이 NA가 되려면 다음을 시도했습니다.
M <- Matrix(NA,max(s),max(r),sparse=TRUE)
for (i in 1:nrow(X))
M[s[i],r[i]] <- d[i]
이 오류가 발생했습니다
Error in checkSlotAssignment(object, name, value) :
assignment of an object of class "numeric" is not valid for slot "x" in an object of class "lgCMatrix"; is(value, "logical") is not TRUE
뿐만 아니라 요소에 액세스하는 데 훨씬 더 오래 걸린다는 것을 알았습니다.
> system.time(Y[3,3])
user system elapsed
0.000 0.000 0.003
> system.time(M[3,3])
user system elapsed
0.660 0.032 0.995
이 매트릭스를 어떻게 만들어야합니까? 하나의 매트릭스가 작업하기에 훨씬 느리게하는 이유는 무엇입니까?
위의 데이터에 대한 코드 스 니펫은 다음과 같습니다.
X <- structure(list(s = c(1089, 1109, 1109, 1109, 1109, 1109), r = c(3772,
190, 2460, 3071, 3618, 38), d = c(1, 1, 1, 2, 1, 7)), .Names = c("s",
"r", "d"), row.names = c(NA, 6L), class = "data.frame")
해결책
예, Thierry의 대답은 확실히 사실입니다. 'Matrix'패키지의 공동 저자로 말할 수 있습니다 ...
다른 질문에 : 왜 "M"에 액세스하는 것이 "y"보다 느려지 는가? 주요 대답은 "M"은 "y"보다 훨씬 더 작다는 것입니다. 따라서 설상 된 크기와 플랫폼의 RAM에 따라 훨씬 작은 개체의 경우 액세스 시간이 더 빠릅니다. .
다른 팁
기본 NA 값을 원하십니까? 내가 아는 한 매트릭스는 세포가 제로가있는 경우에만 희소합니다. NA는 0이 아닌 값이므로 희소 행렬의 모든 이점을 잃어 버립니다. 매트릭스에 0이 거의없는 경우 클래식 매트릭스는 훨씬 더 효율적입니다. 클래식 매트릭스는 치수에 따라 절단 될 벡터와 같습니다. 따라서 데이터 벡터와 치수 만 저장하면됩니다. 스파스 매트릭스는 0이 아닌 값만 저장할뿐만 아니라 위치에도 저장합니다. 충분한 값이있는 경우에만 이점이 있습니다.