2017-11-03 1 views
1

Ich habe einen Datenrahmen mit der folgenden Struktur:Aufräumen eines Datenrahmens mit Sammeln und ...?

record <- c(seq_along(1:10)) 
store <- c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5) 
week <- c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2) 
sales_1 <- c(3, 3, 3, 3, 3, 2, 5, 1, 2, 10) 
sales_2 <- c(1, 2, 4, 5, 6, 2, 3, 6, 1, 8) 
price_1 <- runif(10, 2, 6) 
price_2 <- runif(10, 2, 6) 

df <- data_frame(record, store, week, sales_1, sales_2, price_1, price_2) 

nehme ich an, dies sammeln möchte und sie verändern, wodurch die ‚Record‘, ‚Store‘ und ‚Woche‘ alle Spalten beibehalten werden, aber dann auch ich erstellen eine neue Spalte namens "category", die die abschließenden Zahlen am Ende jeder Spalte "sales_" und "price_" darstellt. Zuletzt würde ich die Werte der Spalten "Umsatz" und "Preis" in zwei Spalten zusammenfassen (einfach "Umsatz" und "Preis"). Das Ergebnis wäre in etwa so aussehen:

record | store | week | category | sales | price 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    1  1  1  1   3  2.51 
    1  1  1  2   1  5.50 
    2  2  1  1   3  4.86 

Ursprüngliche Diskussion kam von here. Dank @markdly, die vorhergesagt würde ich hier am Ende ...

Antwort

2

Sie können gatherUmsatz und Preis Spalten, trennen Sie die Schlüssel in den neuen Header und Kategorie und dann spread der Header:

df %>% 
    gather(key, val, sales_1:price_2) %>% 
    separate(key, c('header', 'category'), sep='_') %>% 
    spread(header, val) 

# A tibble: 20 x 6 
# record store week category price sales 
# * <int> <dbl> <dbl> <chr> <dbl> <dbl> 
# 1  1  1  1  1 5.005186  3 
# 2  1  1  1  2 4.184387  1 
# 3  2  2  1  1 3.790764  3 
# 4  2  2  1  2 4.668122  2 
# ... 
Verwandte Themen