2014-12-18 2 views
0

나는 다음과 같은 형식의 행렬이 개수 : 나는 빨리 최대 색을 계산하고 행 당 계산 어떻게최대 색상 찾기 및

 [,1]  [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
[1,] "blue" "red" "blue" "blue" "blue" "red" "green" "blue" "blue" 
[2,] "green" "red" "blue" "blue" "blue" "red" "green" "blue" "blue" 
[3,] "yellow" "red" "blue" "blue" "blue" "red" "green" "blue" "blue" 
[4,] "red" "red" "blue" "blue" "blue" "red" "green" "blue" "blue" 
[5,] "blue" "red" "green" "blue" "blue" "red" "green" "blue" "blue" 
[6,] "green" "red" "green" "blue" "blue" "red" "green" "blue" "blue" 
... 

합니다.

예를 들어, 행 1의 경우 "blue, 6"입니다. "table"을 호출하는 적용 명령을 통해이를 수행합니다.

그러나 행렬이 190 만 행이므로 시간이 오래 걸립니다. 어떻게 이것을 벡터화 할 수 있습니까?

+1

당신이 현재 비교 사용하고있는 코드를 보여줄 수 :

나는 다른 사람과 같은 데이터를 사용? –

+2

"너무 오래"얼마나 걸립니까? 얼마나 빨리이 작업이 필요합니까? 당신이 그걸 대답 할 수 없다면 나는 당신이 얼마나 오래 "너무 길다"고 말할 수 있다고 생각하지 않는다. – Spacedman

+0

누군가가 엄청나게 속도가 빨라진 솔루션을 게시했지만 코드는 40 초 정도 실행되었습니다. 해결책은 약 1 초 정도 걸리므로 완벽합니다 :-). – user1357015

답변

4

매트릭스의 각 셀마다 몇 가지 가능성이 있습니까? 그것은 당신의 모범과 똑같은가요? 당신은 넥타이가있는 경우, 모든 컬럼의 이름을 얻고 싶다면 예 다음과 같은 것이

dat <- structure(c("blue", "green", "yellow", "red", "blue", "green", 
    "red", "red", "red", "red", "red", "red", "red", "red", "blue", 
    "blue", "blue", "blue", "green", "green", "red", "blue", "blue", 
    "blue", "blue", "blue", "blue", "red", "blue", "blue", "blue", 
    "blue", "blue", "blue", "blue", "red", "red", "red", "red", "red", 
    "red", "blue", "green", "green", "green", "green", "green", "green", 
    "blue", "blue", "blue", "blue", "blue", "blue", "blue", "blue", 
    "blue", "blue", "blue", "blue", "blue", "blue", "green"), .Dim = c(7L, 
    9L)) 

values <- c("blue", "red", "green", "yellow") 
counts <- vapply(values, function(value) rowSums(dat == value), 
    numeric(nrow(dat))) # Thanks to @RichardScriven for the improvement :) 
counts 
#  blue red green yellow 
# [1,] 6 2  1  0 
# [2,] 5 2  2  0 
# [3,] 5 2  1  1 
# [4,] 5 3  1  0 
# [5,] 5 2  2  0 
# [6,] 4 2  3  0 
# [7,] 4 4  1  0 

max.value.col <- max.col(counts) 
max.value <- colnames(counts)[max.value.col] 
max.counts <- counts[cbind(1:nrow(counts), max.value.col)] 
paste(max.value, max.counts, sep = ", ") 
# [1] "blue, 6" "blue, 5" "blue, 5" "blue, 5" "blue, 5" "blue, 4" 

빠를 수 있습니다 경우 다음 작동 것이지만, apply의 성능에 대해 확실하지 잠시 (이 걸릴 수 있습니다 이 경우)

max.value.all.cols <- counts == counts[cbind(1:nrow(counts), max.value.col)] 
paste(
    apply(max.value.all.cols, 1, function(r) paste(paste(colnames(counts)[r],  
     collapse = ", "))), 
    max.counts, sep = ", ") 
+1

'vapply (values, function (value) rowSums (dat == value), numeric (nrow (dat)))'는'sapply'보다 더 빠를 수도 있습니다. –

+0

@konvas 최대 개수 사이에 동점이 있다면'max. col'은 그들 중 하나를 임의로 선택하는 것으로 보인다. 모든 max 값을 찾는'max.col'가 있습니까? – Khashaa

+0

@RichardScriven 좋은 지적! 그것은 속도를 상당히 향상시켜야합니다. – konvas

0

내가 생각하기에 실제 데이터 테이블 솔루션이 있습니다. data.table의 빠른 .N

library(data.table) 

flip <- data.table(t(mat)) 

tally <- lapply(names(flip), 
       function(x) { 
        setnames(flip[, .N, by=eval(x)][order(-N)][1,], 
          c('clr', 'N')) }) 
do.call(rbind, tally) 

#  clr N 
# 1: blue 6 
# 2: blue 5 
# 3: blue 5 
# 4: blue 5 
# 5: blue 5 
# 6: blue 4 

그때 (원래 행렬의 각 행함으로써, 즉) 각 열에서 계산을 수행 행렬을하고 전치 행 주파수를 계산하는 데 활용한다. setnames 비트는 결과를 편리하게 접을 수 있도록 필요하지만 목록 형식으로 결과를 얻으 려한다면 필요하지 않습니다.

mat <- 
matrix(c("blue","red","blue","blue","blue","red","green","blue","blue", 
      "green","red","blue","blue","blue","red","green","blue","blue", 
      "yellow","red","blue","blue","blue","red","green","blue","blue", 
      "red","red","blue","blue","blue","red","green","blue","blue", 
      "blue","red","green","blue","blue","red","green","blue","blue", 
      "green","red","green","blue","blue","red","green","blue","blue"), 
     ncol = 9, byrow = TRUE) 
+0

큰 매트릭스에서는 t() 연산이 느립니다. 신경 쓰지 마 – arvi1000