2016-07-30 4 views
0

나는 연구에서 본 플롯을 복제하는 작업부터 시작했습니다. 그러나 이것을 시도 할 때 나는 어떻게 만들어 졌는지 의아해했다.플롯 생성을위한 데이터 생성 R

이이 같은 음모가 모습입니다 :

enter image description here

플롯의 "x"는 특정 점수 국가의 비율을 나타냅니다 (의이 점수가 모든 국가를 가정 해 봅시다 == 1). 두 선은 두 개의 다른 독립 변수의 백분율을 나타냅니다.

이제 내가 아는 것은 데이터 세트가 이와 유사하게 보입니다 (이것은 단지 샘플이며 내 데이터 세트의 구조와 매우 유사합니다). 위에서 볼 수있는 것처럼

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 

score 변수는 값 0, 1 서수 변수이며, 2. 나는 나를과 유사한 방법으로 그릴 수 있도록 해주는 데이터 프레임을 만들고 싶습니다 위에 표시된 플롯. 이것은 내가 어떻게 진행해야하는지에 당혹 스럽다. 아래의 제 질문은 비슷한 그래프를 그리기 위해 다음을 수행해야한다는 가정에 근거합니다. 내가 점수 == 0 0

궁극적으로 점수 ==와 상태에 대한 X1과 X2의 해당 비율과 국가의 비율을 계산하려면 어떻게

, 나는 점수 나라에 대해 같은 계산을 수행해야합니다 == 1이고 점수 == 2.

몇 가지 의견이 필요합니다. 모든 제안에 감사드립니다.

답변

1

어떤 조건의 비율을 얻을 수있는 쉬운 방법 (예를 들어, 점수의 %는 == 0) mean(condition) * 100를 사용하고 있습니다. 여기에 대한 자세한 블로그 게시물은 https://drsimonj.svbtle.com/proportionsfrequencies-with-mean-and-booleans입니다. 값이 누락 된 경우 mean(condition, na.rm = TRUE) * 100을 사용하십시오.

나는 거의 당신이 제공 한 것과 일치 시뮬레이션 데이터로 시작합니다 :

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 

그런 다음 각에 대한 특정 점수를 관찰하는 시간의 비율을 계산하는 dplyr 패키지에서 group_by(year)summarise(...)을 사용할 수 있습니다 년 :

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 

참고, 난 그냥 0에 변수 to_match을 설정합니다. 다른 값의 경우 1과 2로 변경할 수 있습니다.

그런 다음 같은과 ggplot2로 플롯 할 수 있습니다 :

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

당신은 전설을 원하는 모든 기하 구조 같은을 드리겠습니다 경우 (즉,, 모든 라인 및/또는 모든 포인트)에서 tidyr 패키지의 gather()을 사용하여 긴 포맷을 얻은 다음 플롯에서 groupcolor/linetype의 미학을 일치하도록 변경하십시오. - xtabs (~ 점수 + 년, DAT)``저장 <다음 - t (적용 (

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

안녕하세요, Simon - 감사합니다. 멋진 블로그! 한 가지 문제 : NA가 실제 데이터에 있는데 어떻게 코드에서 제어 할 수 있습니까? 또한 확실한 것은 : 코드에 "country"변수를 넣을 필요가 없다는 것입니다. "to_match"는 모든 일을합니까? – FKG

+1

누락 된 값을 처리하기 위해'mean()'에'na.rm = TRUE'을 추가 할 수 있습니다 (답안에 주석을 추가 할 것입니다). 다시 "국가"라고 말하면, 1 년에 한 번 국가가 나타나지 않는 한 필요가 보이지 않습니까? 그리고 blogR 피드백에 감사드립니다! –

+0

위대한 - 당신이 넣은 모든 작품을 주셔서 감사합니다. 예, 블로그는 정말 멋지게 보입니다. 더 탐구 할게요. – FKG

2

아래 예제 데이터를 사용했습니다. 아마도 이렇게하는 더 벡터화 된 방법도 있지만 작동합니다. 이것은 스코어에만 적용되지만 x1과 x2로 확장하는 것은 간단합니다.

# 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

더 인색 방법은 store'는 TAB1 <'할 수있다'얻을 예를 들면 다음과 같습니다이다 tab1, MARGIN = 2, function (x) x/totalCountries))'. –