2016-10-11 3 views
0

Ich brauche einen inkrementalen Wert Bereich min-max (Datum) zu ergeben, gruppiert nach ISBN.R geben Inkrementalwert min-max Date reichen, Gruppe von

Ich habe diese Beispieldaten (mit 2 verschiedenen ISBN):

ISBN Date 
67898 2013-04-01 
67898 2013-05-07 
67898 2014-11-21 
98756 2012-02-18 
98756 2014-11-07 
98756 2014-11-21 

und das ist das Ergebnis, das ich müsse:

ISBN Date  IncrValue 
67898 2013-04-01 1 
67898 2013-05-07 2 
67898 2014-11-21 3 
98756 2012-02-18 1 
98756 2014-11-07 2 
98756 2014-11-21 3 

Wie ist das möglich in R achive?

+0

Versuchen 'Bibliothek (dplyr); df%>% group_by (ISBN)%>% mutieren (IncrValue = Zeilennummer()) ' –

+0

@ StevenBeaupré das scheint zu funktionieren, aber es zeigt nur einige Beispieldaten im Terminal. Wie kann ich die neue Spalte ('IncrValue') in' df' erstellen? – adlisval

Antwort

0

Wie @ StevenBeaupré zeigt, können Sie es mit dem dplyr-Paket machen. Dies ist eine andere Lösung, die ein Basispaket verwendet.

# Create a toy data dataset 
df <- data.frame(ISBN = rep(c(123, 456), each = 5), Date = seq(as.Date("2000-01-01"), as.Date("2013-01-01"), length.out = 10)) 

# dplyr solution 
library(dplyr) 
df %>% 
group_by(ISBN) %>% 
mutate(IncrValue = row_number()) 

# Base solution 
listed <- split(df, df$ISBN) # split the data frame by the ISBN variable 
newcol <- lapply(listed, function(x) {x$IncrValue <- 1:nrow(x); x}) # create a sequence column within each group 
df2 <- unsplit(newcol, df$ISBN) # unsplit back together. 
+0

@ StevenBeaupré Lösung hat funktioniert – adlisval

0

Versuchen dies in base R:

df$IncrValue <- as.vector(t(aggregate(Date~ISBN, df, order)[,-1])) 

Daten

df <- structure(list(ISBN = c(67898L, 67898L, 67898L, 98756L, 98756L, 
98756L), Date = structure(c(15796, 15832, 16395, 15388, 16381, 
16395), class = "Date")), .Names = c("ISBN", "Date"), class = "data.frame", row.names = c(NA, 
-6L))