2017-02-19 2 views
-1

Ich muss die Anzahl der Zeilen zählen, die Bewertungen von 4 oder größer als 4 für jeden Film (Spalte) haben. Und dann teilen Sie es durch die Gesamtzahl der Bewertungen. Wie kann das gemacht werden? Schauen Sie sich das Bild unten für eine kurze Idee an.Wie kann ich Zeilen verschiedener Spalten mit einer Bedingung zählen

Table

Das Endergebnis sollte wie etwas sein

0.7000000, 'The Shawshank Redemption' 
0.5333333, 'Star Wars IV - A New Hope' 
0.5000000, 'Gladiator' 
0.4444444, 'Blade Runner' 
0.4375000, 'The Silence of the Lambs' 
+0

Willkommen bei StackOverflow! Bitte lesen Sie die Informationen über [wie man eine gute Frage stellt] (http://stackoverflow.com/help/how-to-ask) und wie man ein [reproduzierbares Beispiel gibt] (http://stackoverflow.com/questions/ 5963269/how-to-make-a-great-r-reproduzierbares Beispiel/5963610). Dies wird es anderen sehr erleichtern, Ihnen zu helfen. – Jaap

Antwort

0
ratings<-data.frame(User=c("John","Maria","Anton","Roger","Martina","Ana","Sergi","Marc","Jim","Chris") 
        ,Star.Wars.IV...A.New.Hope=c(1,5,NA,NA,4,2,NA,4,5,4) 
        ,Star.Wars.VI...Return.of.the.Jedi=c(5,3,NA,3,3,4,NA,NA,1,2) 
        ,Forrest.Gump=c(2,NA,NA,NA,4,4,3,NA,NA,2) 
        ) 
ratings 
 User Star.Wars.IV...A.New.Hope Star.Wars.VI...Return.of.the.Jedi Forrest.Gump 
1  John       1         5   2 
2 Maria       5         3   NA 
3 Anton      NA        NA   NA 
4 Roger      NA         3   NA 
5 Martina       4         3   4 
6  Ana       2         4   4 
7 Sergi      NA        NA   3 
8  Marc       4        NA   NA 
9  Jim       5         1   NA 
10 Chris       4         2   2 

Wenn Sie die NA s in den Bewertungen insgesamt enthalten sein sollen zählen:

colSums(ratings[,-1]>=4,na.rm=T)/nrow(ratings) 
 Star.Wars.IV...A.New.Hope Star.Wars.VI...Return.of.the.Jedi      Forrest.Gump 
           0.5        0.2        0.2 

Wenn Sie die NA s von den Bewertungen insgesamt ausschließen möchten zählen:

colMeans(ratings[,-1]>=4,na.rm=T) 
 Star.Wars.IV...A.New.Hope Star.Wars.VI...Return.of.the.Jedi      Forrest.Gump 
        0.7142857143      0.2857142857      0.4000000000 
0

Sie können colMeans verwenden Sie den Prozentsatz und stack das Ergebnis langen Format zu berechnen:

Beispiel Datenrahmen:

df = data.frame(user = c("A", "B", "C", "D"), 
       movieA = c(4,2,NA,5), 
       movieB = c(1,1,NA,4)) 

stack(colMeans(df[-1] >= 4, na.rm = T)) 

#  values ind 
#1 0.6666667 movieA 
#2 0.3333333 movieB 
siehe

So, wie das funktioniert:

df[-1] >= 4      # returns a boolean matrix where ratings >= 4 gives TRUE 

#  movieA movieB 
#[1,] TRUE FALSE 
#[2,] FALSE FALSE 
#[3,]  NA  NA 
#[4,] TRUE TRUE 

Und der Durchschnitt eines boolean Vektor ist der Prozentsatz des Trues (mit NA entfernt), so berechnet den Durchschnitt für alle Spalten mit colMeans geben Ihnen den Prozentsatz du brauchst.

1

Die Daten sind nicht im üblichen ordentlichen Format. df ist Ihr Dataframe mit einigen Temp-Werten.

library(dplyr) 
df <- data_frame(user = letters[1:10], 
      m1 = c(1,5,NA,NA,4,2,NA,4,5,4), 
      m2 = c(5,3,NA,3,3,4,NA,NA,1,2), 
      m3 = c(2,NA,NA,NA,4,4,3,NA,NA,NA)) 
df 
# A tibble: 10 × 4 
# user m1 m2 m3 
# <chr> <dbl> <dbl> <dbl> 
#1  a  1  5  2 
#2  b  5  3 NA 
#3  c NA NA NA 
#4  d NA  3 NA 
#5  e  4  3  4 
#6  f  2  4  4 
#7  g NA NA  3 
#8  h  4 NA NA 
#9  i  5  1 NA 
#10  j  4  2 NA 

sie wandelt es in ein key:value Paar heißt movie:rating, in diesem Fall.

library(tidyr)  
df <- gather(df, movie, rating, -user) 
df 
# A tibble: 30 × 3 
# user movie rating 
# <chr> <chr> <dbl> 
#1  a m1  1 
#2  b m1  5 
#3  c m1  NA 
#4  d m1  NA 
#5  e m1  4 
#6  f m1  2 
#7  g m1  NA 
#8  h m1  4 
#9  i m1  5 
#10  j m1  4 
# ... with 20 more rows 

Jetzt wird es einfach zu fassen.

df %>% group_by(movie) %>% summarise(countp = mean(rating>=4, na.rm=T)) 
# A tibble: 3 × 2 
# movie countp 
# <chr> <dbl> 
#1 m1 0.7142857 
#2 m2 0.2857143 
#3 m3 0.5000000 
+0

Hey, deine Lösung ist richtig! Danke für die Hilfe. Aber da ist ein kleines Problem. Wenn ich verwende: zusammenfassen (Hallo = Summe (Bewertung> = 4, na.rm = TRUE)/n()) n() gibt die Anzahl als 20, die die Gesamtzahl der Benutzer. Ich muss es durch die Anzahl der Bewertungen für diesen bestimmten Film teilen. Da einige Benutzer nicht für einige Filme bewertet haben. – vr9211

+0

@ vr9211: Siehe meine zweite/Psidoms Lösung: benutze 'mean (..., na.rm = T)' anstelle von 'sum (..., na.rm = T)/n()'.PS: Da dies Ihre erste Frage ist: Vergessen Sie nicht, die Antwort, die Sie angenommen haben, zu verbessern (oder eine andere Antwort, die Sie für hilfreich halten). Willkommen auf der Seite! – mschilli

+0

@ vr9211 Der 'group_by (Film)' würde sich darum kümmern. Sie können neue Spalten erstellen, um 'summieren zu überprüfen (count = n())' –

Verwandte Themen