2016-07-30 18 views
0

Ich begann mit der Aufgabe, eine Handlung zu replizieren, die ich in einer Studie gesehen habe. Beim Versuch, dies zu tun, war ich jedoch verwirrt, wie es erstellt wurde.Generieren von Daten für die Erstellung eines Plots in R

Dies ist, was die Handlung wie folgt aussieht:

enter image description here

Das „x“ in der Handlung der Anteil der Länder mit einer bestimmten Punktzahl ist (wir alle Länder sagen, dass Score == 1). Die zwei Linien repräsentieren den Prozentsatz von zwei anderen unabhängigen Variablen.

Nun, was ich weiß ist, dass der Datensatz in etwa so aussah (dies ist nur ein Beispiel - sehr ähnlich der Struktur meines Datensatzes).

country year x1 x2 score 
A  1990 0 0 0 
A  1991 1 0 1 
A  1992 1 0 1 
A  1993 0 0 0 
A  1995 1 0 0 
A  1996 1 0 2 
A  1997 1 0 0 
B  1990 0 0 0 
B  1991 0 0 0 
B  1992 0 0 1 
B  1993 0 0 2 
B  1995 0 1 2 
B  1996 0 0 2 
B  1997 0 1 2 
C  1990 0 1 2 
C  1991 1 1 0 
C  1992 1 0 0 
C  1993 1 0 0 
C  1995 1 0 0 
C  1996 0 0 1 
C  1997 0 0 1 
C  1998 1 1 0 
D  1990 0 0 2 
D  1991 0 0 2 
D  1992 1 1 2 
D  1993 1 1 0 
D  1995 0 0 1 
D  1996 0 0 1 
D  1997 0 0 1 

Wie Sie oben sehen haben, das score Variable ist eine Ordnungs Variable mit den Werten 0, 1 und 2. Ich möchte einen Datenrahmen erstellen, die mich in ähnlicher Weise wie die plotten ermöglichen würden Diagramm oben angezeigt. Hier bin ich verwirrt, wie es weitergeht. Meine Fragen basieren auf der Annahme, dass ich Folgendes tun muss, um eine ähnliche Grafik zu erstellen.

Wie kann ich den Prozentsatz der Staaten mit Score == 0 und dem entsprechenden Prozentsatz von x1 und x2 für Staaten mit Score == 0

Letztendlich berechnen, muss ich die gleiche Berechnung für Länder mit Score tun == 1 und score == 2.

Ich brauche etwas Input - also schätze ich alle Vorschläge!

Antwort

1

Eine einfache Möglichkeit, einen bestimmten Prozentsatz einer Bedingung (beispielsweise% der Partitur == 0) wird mit mean(condition) * 100 zu bekommen. Hier ist ein detaillierter Blogpost darüber: https://drsimonj.svbtle.com/proportionsfrequencies-with-mean-and-booleans. Hinweis zu verwenden mean(condition, na.rm = TRUE) * 100 wenn Sie fehlende Werte haben.

Ich werde mit simulierten Daten beginnen, die in etwa dem entspricht, was Sie zur Verfügung gestellt haben:

set.seed(987) 
d <- data.frame(
    year = rep(c(1991:2000), each = 10), 
    x1 = sample(c(0, 1, 2), 100, replace = TRUE), 
    x2 = sample(c(0, 1, 2), 100, replace = TRUE), 
    score = sample(c(0, 1, 2), 100, replace = TRUE) 
) 
head(d) 
#> year x1 x2 score 
#> 1 1991 1 2  2 
#> 2 1991 2 1  2 
#> 3 1991 1 1  2 
#> 4 1991 1 0  2 
#> 5 1991 2 0  0 
#> 6 1991 0 0  1 

Dann können Sie group_by(year) und summarise(...) von dplyr Paket verwenden, um die Prozent der Zeit berechnen Sie eine bestimmte Punktzahl für jede beobachten Jahr:

library(dplyr) 
to_match <- 0 
d <- d %>% 
    group_by(year) %>% 
    summarise(
    x1 = mean(x1 == to_match) * 100, 
    x2 = mean(x2 == to_match) * 100, 
    score = mean(score == to_match) * 100 
) 
d 
#> # A tibble: 10 x 4 
#>  year x1 x2 score 
#> <int> <dbl> <dbl> <dbl> 
#> 1 1991 10 60 30 
#> 2 1992 60 20 30 
#> 3 1993 40 40 30 
#> 4 1994 40 50 50 
#> 5 1995 50 50 20 
#> 6 1996 30 40 20 
#> 7 1997 20 30  0 
#> 8 1998 20 60 40 
#> 9 1999 40 30 20 
#> 10 2000 20 40 40 

Hinweis, habe ich nur die Variable to_match-0. Sie können für andere Werte zu 1 und 2 wechseln.

Dann können Sie zeichnen mit ggplot2 mit so etwas wie:

library(ggplot2) 
d %>% 
    ggplot(aes(x = year)) + 
    scale_x_continuous(breaks = 1991:2000) + 
    geom_line(aes(y = x1)) + 
    geom_line(aes(y = x2), color = "grey") + 
    geom_point(aes(y = score)) + 
    scale_y_continuous(limits = c(0, 100)) + 
    ylab("Percent Countries") + 
    theme_bw() 

enter image description here

Wenn Sie eine Legende wollen und sind glücklich, alle GEOMS das gleiche zu machen (d, alle Linien und/oder alle Punkte) können Sie gather() aus dem tidyr Paket verwenden, um in langes Format zu kommen, dann die group und color/linetype Ästhetik in der Handlung ändern, um zusammenzupassen. Hier ein Beispiel:

library(tidyr) 
d %>% 
    gather(-year, key = "var", value = "Percent") %>% 
    ggplot(aes(x = year, y = Percent, group = var)) + 
    scale_x_continuous(breaks = 1991:2000) + 
    geom_line(aes(linetype = var, color = var)) + 
    geom_point(size = 2) + 
    scale_y_continuous(limits = c(0, 100)) + 
    ylab("Percent Countries") + 
    theme_bw() 

enter image description here

+0

Hallo Simon - danke dafür. Toller Blog! Ein Problem: NAs in meinen realen Daten, wie kontrolliere ich für sie im Code? Außerdem, um sicher zu sein: Ich muss die Variable "country" nicht in den Code eingeben, oder? "to_match" macht den ganzen Job? – FKG

+1

Kann 'na.rm = TRUE' in' mean() 'einfügen, um mit fehlenden Werten umzugehen (Ich füge einen Kommentar in die Antwort ein). Re "Land", sehe ich keinen Bedarf, es sei denn, Sie haben ein Land erscheinen mehr als einmal pro Jahr? Und vielen Dank blogR Feedback! –

+0

Großartig - vielen Dank für all die Arbeit, die du geleistet hast. Ja, der Blog sieht wirklich gut aus, ich werde ihn genauer erkunden. – FKG

2

Ich verwendete Ihre Beispieldaten unten in dat. Vielleicht gibt es auch eine vektorisierte Art, dies zu tun, aber es funktioniert. Dies gilt nur für den Punktestand, aber es ist einfach, es auch auf x1 und x2 zu erweitern.

# get unique score values and unique years 
uniqScore = unique(dat$score) 
uniqYear = unique(dat$year) 
# assuming total number of countries remains constant 
totalCountries = length(unique(dat$country)) 
# empty matrix to store results 
store = matrix(NA, length(uniqYear), length(uniqScore)) 

# loop over unique scores 
for (i in 1:length(uniqScore)) { 
    # loop over unique years 
    for (j in 1:length(uniqYear)) { 
    # find the number of observations with a given year and score 
    # subsequently divide it by the total number of possible countries 
    # to obtain a percentage and save it in store 
    store[j, i] = length(dat[dat$year == uniqYear[j] & 
           dat$score == uniqScore[i], 1])/
     totalCountries 
    } 
} 

# plot results 
matplot(uniqYear, store, type = 'b', pch = 1:3, lty = 2, bty = 'n', las = 1, 
     ylab = 'Percentage', xlab = 'Year') 
legend('topright', legend = uniqScore, pch = 1:3, lty = 2, col = 1:3, bty = 'n') 

# or to make it into a dataframe 
df = data.frame(percentage = c(store), 
       score = rep(uniqScore, each = nrow(store))) 

a busy cat

+1

Ein sparsamer Weg, um 'store' sein kann' tab1 <- xtabs (~ Partitur + Jahr, dat) 'gefolgt von' store <- t (anzuwenden (tab1, MARGIN = 2, Funktion (x) x/totalCountries)). –