2017-12-08 1 views
0

Ich möchte einen aggregierten Datensatz in einen neuen abgeleiteten Datensatz mit den einzelnen Instanzen transformieren, die der ursprünglichen Aggregation entsprechen. Ich habe den Datensatz Titanic von R geladen und habe mir den Datenrahmen angeschaut. Ich sehe, dass die Häufigkeiten jedes Tupelvorkommens aggregiert sind. (Zum Beispiel überlebten 20 weibliche erwachsene Mannschaftsmitglieder den Unfall). Ich wollte den Datensatz neu aufbauen, indem ich jedes Tupel durch die entsprechenden nicht aggregierten Tupel (z. B. das 20-fache des Tupels "Crew, Female, Adult, Yes") ersetzt habe. Ich weiß, wie man einen Datensatz aggregiert, aber ich kann einen bereits aggregierten Datensatz nicht transformieren. Jeder Tipp würde sehr geschätzt werden.Einen Datensatz transformieren

library(dplyr) 
library(purrr) 
library(tidyr) 

# keep data with frequency > 0 
T = data.frame(Titanic, stringsAsFactors = F) %>% filter(Freq > 0) 

tbl_df(T) %>%       # tbl_df() only used to produce a more readable output (i.e. print only a few rows) 
    mutate(id = map(Freq, ~ 1:.)) %>%  # create a vector of ids from 1 to Freq for each row 
    unnest(id)       # expand the vector 

# # A tibble: 2,201 x 6 
# Class Sex Age Survived Freq id 
# <fctr> <fctr> <fctr> <fctr> <dbl> <int> 
# 1 3rd Male Child  No 35  1 
# 2 3rd Male Child  No 35  2 
# 3 3rd Male Child  No 35  3 
# 4 3rd Male Child  No 35  4 
# 5 3rd Male Child  No 35  5 
# 6 3rd Male Child  No 35  6 
# 7 3rd Male Child  No 35  7 
# 8 3rd Male Child  No 35  8 
# 9 3rd Male Child  No 35  9 
# 10 3rd Male Child  No 35 10 
# # ... with 2,191 more rows 

Sie können die ID-Spalte entfernen, wenn Sie möchten. Ich habe es dort gelassen, um es einfacher zu sehen, wie der Prozess funktioniert. Sie können auch überprüfen, dass die Anzahl der Zeilen des neuen Datasets 2.201 ist, was der Summe (T $ Freq) entspricht. Erwartungsgemäß ist die Summe der Häufigkeiten des ursprünglichen Datensatzes die Anzahl der Zeilen des neuen Datensatzes.

+0

Was ist mit denen mit 0 Frequenz? – AntoniosK

+0

@AntoniosK vielleicht, um sie nach oder unterlassen sie? – gtcodes

Antwort

0
library(dplyr) 
library(purrr) 
library(tidyr) 

# keep data with frequency > 0 
T = data.frame(Titanic, stringsAsFactors = F) %>% filter(Freq > 0) 

tbl_df(T) %>%       # tbl_df() only used to produce a more readable output (i.e. print only a few rows) 
    mutate(id = map(Freq, ~ 1:.)) %>%  # create a vector of ids from 1 to Freq for each row 
    unnest(id)       # expand the vector 

# # A tibble: 2,201 x 6 
# Class Sex Age Survived Freq id 
# <fctr> <fctr> <fctr> <fctr> <dbl> <int> 
# 1 3rd Male Child  No 35  1 
# 2 3rd Male Child  No 35  2 
# 3 3rd Male Child  No 35  3 
# 4 3rd Male Child  No 35  4 
# 5 3rd Male Child  No 35  5 
# 6 3rd Male Child  No 35  6 
# 7 3rd Male Child  No 35  7 
# 8 3rd Male Child  No 35  8 
# 9 3rd Male Child  No 35  9 
# 10 3rd Male Child  No 35 10 
# # ... with 2,191 more rows 

Sie können die id Spalte entfernen, wenn Sie möchten. Ich habe es dort gelassen, um es einfacher zu sehen, wie der Prozess funktioniert.

Sie können auch überprüfen, dass die Anzahl der Zeilen des neuen Datensatzes 2,201 ist, was sum(T$Freq) entspricht. Erwartungsgemäß ist die Summe der Häufigkeiten des ursprünglichen Datensatzes die Anzahl der Zeilen des neuen Datensatzes.