2016-06-30 8 views
1

ich einen Datensatz haben, die wie folgt aussieht:Collapse und aggregieren mehrere Zeilenwerte nach Datum

date, location, value, tally, score 
2016-06-30T09:30Z, home, foo, 1, 
2016-06-30T12:30Z, work, foo, 2, 
2016-06-30T19:30Z, home, bar, , 5 

ich diese Zeilen aggregieren müssen zusammen, um ein Ergebnis wie zu erhalten:

date, location, value, tally, score 
2016-06-30, [home, work], [foor, bar], 3, 5 

Es gibt mehrere Herausforderungen für mich:

  • Die resultierende Reihe (eine tägliche Gesamt) müssen die Zeilen für diesen Tag (2016.06.30 in meinem oben schließen Beispiel
  • Einige Zeilen (Strings) werden in einem Array führen alle Werte vorhanden an diesem Tag
  • Einige andere (Ints), die in einer Summe führen

ich einen Blick auf dplyr gehabt haben, und wenn möglich möchte ich dies in R.

Vielen Dank für Ihre Hilfe!


Edit:

Hier ist ein dput der Daten

structure(list(date = structure(1:3, .Label = c("2016-06-30T09:30Z", 
"2016-06-30T12:30Z", "2016-06-30T19:30Z"), class = "factor"), 
    location = structure(c(1L, 2L, 1L), .Label = c("home", "work" 
    ), class = "factor"), value = structure(c(2L, 2L, 1L), .Label = c("bar", 
    "foo"), class = "factor"), tally = c(1L, 2L, NA), score = c(NA, 
    NA, 5L)), .Names = c("date", "location", "value", "tally", 
"score"), class = "data.frame", row.names = c(NA, -3L)) 
+1

@ Hack-R: oops sorry! Ich habe meine Frage mit einem dput geändert. – basbabybel

Antwort

1
mydat<-structure(list(date = structure(1:3, .Label = c("2016-06-30T09:30Z", 
                 "2016-06-30T12:30Z", "2016-06-30T19:30Z"), class = "factor"), 
         location = structure(c(1L, 2L, 1L), .Label = c("home", "work" 
        ), class = "factor"), value = structure(c(2L, 2L, 1L), .Label = c("bar", 
                         "foo"), class = "factor"), tally = c(1L, 2L, NA), score = c(NA, 
                                        NA, 5L)), .Names = c("date", "location", "value", "tally", 
                                             "score"), class = "data.frame", row.names = c(NA, -3L)) 

mydat$date <- as.Date(mydat$date) 

require(data.table) 
mydat.dt <- data.table(mydat) 
mydat.dt <- mydat.dt[, lapply(.SD, paste0, collapse=" "), by = date] 

cbind(mydat.dt, aggregate(mydat[,c("tally", "score")], by=list(mydat$date), FUN = sum, na.rm=T)[2:3]) 

, die Sie gibt:

  date  location  value tally score 
1: 2016-06-30 home work home foo foo bar  3  5 

Beachten Sie, wenn Sie Sie wollten wohl tun könnte alles in einem Schritt die Umformung der data.table aber ich fand, dass dies ein schneller und einfacher Weg für mich ist, das gleiche in 2 Schritten zu erreichen.

+1

Danke. Ich habe einige hilfreiche Informationen gefunden, um 'lapply' und' .SD' zu verstehen [in dieser separaten Frage] (http://stackoverflow.com/questions/32276887/use-of-lapply-sd-in-data-table-r) . – basbabybel

+1

@basbabybel Glücklich zu helfen –

Verwandte Themen