2016-11-29 2 views
0

Ich habe einen Datenrahmen wie dieser R: Wie werden zwei ähnliche Zeilen in einem Datenrahmen zu einem zusammengeführt?

path     clicks 
/a/b/index.html   1000 
/a/b/index.html#1  500 
/a/index.html#1   250 

R-Code

strukturiert:

path <- c('/a/b/index.html','/a/b/index.html#1','/a/index.html#1') 
clicks <- c(1000, 500, 250) 
d.f <- data.frame(path,clicks) 

Die ersten beiden Reihen sind grundsätzlich der gleiche URL-Pfad. Daher würde ich diese beiden Zeilen zu einem zusammenführen wollen, indem Sie den Pfad hinzufügen und den Pfadnamen des Ergebnisses auf "# 1" reduzieren, während Sie die alten Namen loswerden. Das Ergebnis wäre in etwa so aussehen:

path    clicks 
#1     1500 
/a/index.html#1  250 

Von dem, was ich diese Zeilen lesen kann mit aggregate() erreicht werden, aber ich kann nicht eine anständige Einführung gründlich zu erklären, wie diese Funktion arbeitet finden beruhigen.

Wie auch immer, ich wäre dankbar, wenn Sie mir entweder eine Lösung anbieten oder mich auf eine anfängerfreundliche Quelle verweisen könnten, um mich mit dem relevanten Material zu versorgen.

Antwort

1

Das ist wirklich, was Sie wollen, denke ich (ich werde am Ende erklären, warum).

path <- c('/a/b/index.html','/a/b/index.html#1','/a/index.html#1') 
clicks <- c(1000, 500, 250) 
d.f <- data.frame(path,clicks) 
d.f$path <- gsub("\\#\\d", "", d.f$path) 
d.f 

aggregate(d.f$clicks ~ d.f$path, FUN = sum) 

den Link Reduzierung auf „# 1“ so gut wie unmöglich wäre, da die Reihen 1 und 3 identisch machen würde, was nicht ist, was Sie wollen. Plus ich nehme an, wenn du "https://stackoverflow.com/a/b/index.html#2" hättest, möchtest du das mit den Zeilen 1 und 2 aggregiert haben und nicht separat aufbewahrt werden.

Die andere Möglichkeit wäre, einen "# 1" für alle Links hängen, die ein Aggregat nicht

d.f$path[grep("html$", d.f$path)]<-paste0(d.f$path[grep("html$", d.f$path)], "#1") 
1

Eine mögliche dplyr Lösung mit # 1 und # 2 und dann:

df=data.frame(path=c("https://stackoverflow.com/a/b/index.html","https://stackoverflow.com/a/b/index.html#1","https://stackoverflow.com/a/b/index.html#2","https://stackoverflow.com/a/index.html"), 
       clicks=c(1000,500,150,250)) 
       path clicks 
1 /a/b/index.html 1000 
2 /a/b/index.html#1 500 
3 /a/b/index.html#2 150 
4  /a/index.html 250 

    df%>% 
    mutate(path_simp=gsub("#.*","",path))%>% 
    transform(path=gsub("^[^#]*","",path,perl=T))%>% 
    group_by(path_simp)%>% 
    mutate(path=ifelse(any(!path==""),path[path!=""][length(path[path!=""])],path_simp))%>% 
    summarise(clicks=sum(clicks),path=last(path))%>% 
    select(path,clicks) 

Welche gibt:

  path clicks 
      <chr> <dbl> 
1   #2 1650 
2 /a/index.html 250 

Die Idee ist, eine neue Spalte erstellen path_simp welches den Pfad ohne irgendwelche # nachher enthält und in path jeden Pfad ersetzt, der #number nur mit #number enthält.
path_simp wird für die Gruppierung verwendet und path wird geändert, um nur die Nummer zu haben, wenn es eine gibt.
Zusammenfassung von clicks und path werden mit sum() und last() für path berechnet.

+0

Während ich beide Antworten hilfreich fand, passte ich schließlich mehr von emilliman5 Antwort auf meine Lösung. Als nächstes werde ich einen genaueren Blick auf das dplyer-Paket werfen. – SomewhereDave

Verwandte Themen