2015-01-15 7 views
0

파일이 30 개 있습니다. 여기에는 userid, itemid, moviename, rating, date가 포함되며 나머지는 영화가 속한 장르를 분류하는 데 사용됩니다. 장르 범주는 행에 2 진 값이있는 열 이름입니다. 영화가 장르에 속하면 해당 열 아래에 1이 있고 그렇지 않으면 0이 있습니다. 장르별 평균 평점을 계산하고 사용 가능한 프로세스가 더 있는지 알고 싶습니까?장르별 평균 평점은 어떻게 계산합니까?

저는 현재 값이 '1'인 각 장르를 선택하고 평균 평점을 계산하여 데이터 필터링을 시도했습니다. 그러나 나는 거의 24 개의 장르를 가지고 있으며, 그렇게하는 것은 비효율적이라고 생각합니다. 내가 시도한 또 다른 방법은 장르 열을 반복하고 값이 '1'인 각 장르를 다시 필터링하지만 루프는 많은 시간을 소비하며 데이터가 크면 (100,000 개가 넘는 행) R이 때때로 재생할 수 있습니다. 나는 알아 차렸다.

같은 작업을 수행 할 수있는 용융, dcast 또는 다른 방법과 같은 루프를 피하는 또 다른 방법이 있는지 물어보고 싶습니다.

내 데이터 세트의 dput을 제공합니다.

dput(data) 
structure(list(user_id = c(10L, 890L, 867L, 5L, 320L, 630L, 151L, 
699L, 21L, 450L, 179L, 135L, 314L, 487L, 735L, 823L, 169L, 889L, 
846L), item_id = c(447L, 660L, 191L, 441L, 1052L, 568L, 414L, 
1061L, 872L, 33L, 302L, 581L, 568L, 280L, 181L, 503L, 498L, 207L, 
497L), Movie_title = structure(c(6L, 11L, 2L, 3L, 9L, 17L, 15L, 
10L, 14L, 8L, 13L, 12L, 17L, 18L, 16L, 5L, 1L, 7L, 4L), .Label = c("African Queen, The (1951)", 
"Amadeus (1984)", "Amityville Horror, The (1979)", "Bringing Up Baby (1938)", 
"Candidate, The (1972)", "Carrie (1976)", "Cyrano de Bergerac (1990)", 
"Desperado (1995)", "Dracula: Dead and Loving It (1995)", "Evening Star, The (1996)", 
"Fried Green Tomatoes (1991)", "Kalifornia (1993)", "L.A. Confidential (1997)", 
"Love Jones (1997)", "My Favorite Year (1982)", "Return of the Jedi (1983)", 
"Speed (1994)", "Up Close and Personal (1996)"), class = "factor"), 
    Rating = c(4L, 2L, 5L, 1L, 2L, 4L, 5L, 3L, 2L, 5L, 4L, 4L, 
    5L, 5L, 4L, 5L, 3L, 3L, 5L), Date = structure(c(7L, 15L, 
    12L, 4L, 1L, 2L, 9L, 8L, 19L, 14L, 18L, 10L, 6L, 16L, 5L, 
    11L, 17L, 13L, 3L), .Label = c("1/14/1998", "1/25/1998", 
    "1/5/1998", "10/1/1997", "10/13/1997", "10/26/1997", "10/27/1997", 
    "11/10/1997", "11/15/1997", "11/18/1997", "11/2/1997", "11/21/1997", 
    "11/22/1997", "12/18/1997", "12/24/1997", "12/30/1997", "3/31/1998", 
    "4/10/1998", "9/22/1997"), class = "factor"), unknown = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L), Action = c(0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 
    1L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 0L), Adventure = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 
    1L, 0L, 0L), Animation = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Children = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L), Comedy = c(0L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L), Crime = c(0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L), Documentary = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Drama = c(0L, 
    1L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 
    0L, 1L, 0L), Fantasy = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Film.Noir = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L), Horror = c(1L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Musical = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L), Mystery = c(0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Romance = c(0L, 
    0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 
    1L, 1L, 0L), Sci.Fi = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L), Thriller = c(0L, 
    0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 
    0L, 0L, 0L), War = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L), Western = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L), Short = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), History = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L), Biography = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Sport = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L), Family = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("user_id", 
"item_id", "Movie_title", "Rating", "Date", "unknown", "Action", 
"Adventure", "Animation", "Children", "Comedy", "Crime", "Documentary", 
"Drama", "Fantasy", "Film.Noir", "Horror", "Musical", "Mystery", 
"Romance", "Sci.Fi", "Thriller", "War", "Western", "Short", "History", 
"Biography", "Sport", "Family"), class = "data.frame", row.names = c(NA, 
-19L)) 
+0

'dput (yourdata)'의 결과를 게시 할 수 있습니까? 탭 때문에이 형식에서 R로 읽는 것은 매우 어렵습니다. –

+0

나는 dput의 메카닉에 익숙하지 않아 원본에서 처음 10 행을 가져 왔습니다. – syebill

+0

간단히'dput (head (yourdata, 10))'을 할 수 있습니다. 이렇게하면 다른 사람이 자신의 R 콘솔에 붙여 넣을 수 있고 동일한 개체를 얻을 수 있습니다. 그랬듯이, 파일을 R에 읽으려면 많은 열정이 필요합니다 (탭이 보존되지 않기 때문에) –

답변

3

dplyrtidyr에 대한 좋은 사용 사례입니다 :

library(dplyr) 
library(tidyr) 
dat %>% gather(genre, value, unknown:Family) %>% filter(value == 1) %>% 
    group_by(genre) %>% summarize(average = mean(Rating)) 

하는이 코드 :

  • 은 별도의 행에 영화/장르 쌍의 각각을 수집 (이있을 것
  • 영화가 장르에 속하는 경우에만 필터가 적용됩니다.
  • 장르별 그룹 및 평균 등급을 찾기 위해 각 내에서 요약
+0

모두가 놀랍습니다. – syebill

+0

@ user42571. 천만에요. 또한'흙으로 만든 (장르, 값, 알려지지 않은 : 가족) %> % 필터 (값 == 1)'포맷으로 정리하면 멋진 그림을 그릴 수 있습니다. 예를 들어,'library (ggplot2); ggplot (tidied, aes (장르, 등급)) + geom_boxplot()'. –

+0

패키지 'tidyr'에 3.0.3 버전을 사용할 수 없다고 묻고 싶습니다. 그것을 사용하려면 이전 버전이 필요합니까? RStudio를 실행하고 있습니다. - 버전 0.98.1091 – syebill

-1

오래된 패션 방식으로도 작동합니다 (당신은 중간 또는뿐만 아니라 표준 편차와 같은 다른 작업을 수행 할 수 있습니다) :

genres <- c('Action','Adventure','Animation') 
means <- numeric(length(genres)) 
names(means) <- genres 
for(g in genres) 
    meanRatings[g] <- mean(myData$Rating[mydata[,g]==1]) 
means 
+0

R에서 이러한 작업을 수행하는 루프를 제안해서는 안된다고 생각한다. – CMichael