2017-12-19 8 views
0

Ich habe Probleme beim Zählen und Aggregieren von Funktionen mit Bedingungen auf den Feldern.Wie erstellt man Gruppen und zählt Variablen, um Beziehungen zwischen Variablen zu finden?

Beispiel:

df = tbl_df(data.frame(
    users=c("1", "1", "1", "1", "2", "2", "2", "3", "3", "4", "4", "4", "4"), 
    projects=c("100", "101", "102", "103", "104", "105", "106", "107", "108", "109", "110", "111", "112"), 
    from=c("0", "0", "111", "106", "111", "101", "0", "101", "0", "100", "106", "108", "0"))) 

Die Tabelle enthält die Benutzer (Benutzer), benutzereigenen Projekte (Projekte) und Projekte, die von anderen Projekten von anderen Benutzern stammen (von).

Ich würde gerne wissen, wer die Benutzer sind, die mehr Beziehungen mit anderen Benutzern durch den Einsatz von Projekten haben. Wie die Tabelle zeigt, können die Projekte eines Benutzers von anderen Benutzern (von) verwendet werden und der Benutzer kann eigene Projekte (Projekte) haben.

Ich dachte über das Zählen der Beziehungen nach: Anzahl der Benutzerprojekte, die von anderen Benutzern verwendet werden, und Anzahl der Benutzerprojekte, für die er nicht der Eigentümer ist.

Könnte mir jemand einen Hinweis geben, wie man das mit ddply oder einer anderen Funktion wie summarize oder group_by macht?

Ich konnte eine Funktion generieren mit für, aber ich weiß, das ist nicht die am besten geeignete Lösung, vor allem, wenn ich Millionen von Benutzern in Bearbeitung haben.

Vielen Dank im Voraus!

Antwort

1
out <- data.frame(summarize(group_by(df, users), 
        number_of_user_owned_projects = length(df$from[df$from %in% projects]), 
        number_of_projects_from_others = length(unique(from[from != 0])))) 
out 
    users number_of_user_owned_projects number_of_projects_from_others 
1  1        3        2 
2  2        2        2 
3  3        1        1 
4  4        2        3 
+0

In number_of_user_owned_projects, würde Ich mag die Anzahl von Projekten in den ** Projekte identifizieren ** Spalte, die ** von ** Spalte in der sind. Nicht nur die Menge der Projekte. Zum Beispiel hat Benutzer 1 das Projekt 101 zweimal von verschiedenen Benutzern verwendet. Also, ich möchte diese Analyse für jedes Benutzerprojekt und die Summe pro Benutzer haben. –

+0

siehe Update. – AidanGawronski

+0

@AidanGawronski Wie funktioniert 'länge (df $ von [df $ von% in% projekte]) '? –

0
temp = df %>% group_by(from) %>% summarise(cntr = n()) %>% filter(from != 0) 

#temp 

# from cntr 
#1 100  1 
#2 101  2 
#3 106  2 
#4 108  1 
#5 111  2 


output = left_join(df, temp, by = c("projects" = "from")) %>% 
      group_by(users) %>% 
      summarize(user_owned = sum(cntr, na.rm = TRUE), other_owned = sum(from != 0)) 

#output 

# users user_owned other_owned 

#1  1   3   2 
#2  2   2   2 
#3  3   1   1 
#4  4   2   3 
+0

Danke! Ich schätze deine Hilfe sehr. –

Verwandte Themen