예를 들어 ifelse(test,“참”,“거짓”) 이라면 아래 silver$wrong.obama 에는 0,1대신 참,거짓으로 출련된다.
silver <- read.csv("C:\\Users\\ms\\Desktop\\silver.csv", header = T)
silver$wrong.obama <- ifelse(silver$result.obama >= silver$obama.min & silver$result.obama <=
silver$obama.max, 0, 1)
silver$wrong.romney <- ifelse(silver$result.romney >= silver$romney.min & silver$result.romney <=
silver$romney.max, 0, 1)
silver
## State result.obama result.romney obama.min obama.max
## 1 Alabama 38.56 60.52 32.9 40.5
## 2 Alaska 41.11 54.51 32.7 44.7
## 3 Arizona 43.42 54.99 42.9 49.5
## 4 Arkansas 36.89 60.56 34.8 42.4
## 5 California 59.11 38.56 55.2 61.0
## 6 Colorado 51.27 46.44 47.8 53.8
## 7 Connecticut 50.85 47.83 53.3 59.9
## 8 Delaware 58.61 39.99 54.1 65.1
## 9 D. C. 91.12 7.11 89.8 96.2
## 10 Florida 49.85 49.29 47.1 52.5
## 11 Georgia 45.43 53.40 42.8 48.2
## 12 Hawaii 70.54 27.84 62.6 70.4
## 13 Idaho 32.33 64.84 27.6 36.6
## 14 Illinois 57.29 41.06 56.8 62.8
## 15 Indiana 43.67 54.41 42.3 48.3
## 16 Iowa 51.81 46.38 47.9 54.3
## 17 Kansas 38.04 60.19 31.8 44.0
## 18 Kentucky 38.42 59.89 35.8 44.8
## 19 Louisiana 40.56 57.81 35.8 42.8
## 20 Maine 56.21 40.57 52.3 59.5
## 21 Maryland 61.65 36.60 57.9 63.9
## 22 Massachusetts 60.91 37.49 55.2 62.8
## 23 Michigan 53.29 45.78 50.3 55.7
## 24 Minnesota 52.60 45.01 50.8 56.6
## 25 Mississippi 43.70 55.44 34.2 44.6
## 26 Missouri 44.26 53.88 42.7 48.5
## 27 Montana 41.92 55.18 41.3 49.1
## 28 Nebraska 37.82 60.49 37.1 43.7
## 29 Nevada 52.30 45.73 48.8 54.8
## 30 New Hampshire 52.19 46.46 47.9 54.9
## 31 New Jersey 57.97 41.02 52.2 58.8
## 32 New Mexico 52.87 42.97 50.5 57.7
## 33 New York 62.70 35.90 59.5 65.3
## 34 North Carolina 48.29 50.45 46.3 51.5
## 35 North Dakota 38.92 58.65 38.1 45.9
## 36 Ohio 50.29 48.29 48.6 54.0
## 37 Oklahoma 33.23 66.77 30.0 37.6
## 38 Oregon 53.38 43.59 49.9 57.3
## 39 Pennsylvania 52.47 46.27 49.9 55.1
## 40 Rhode Island 62.88 35.05 57.5 66.1
## 41 South Carolina 43.89 54.75 38.7 47.7
## 42 South Dakota 39.86 57.89 38.3 46.7
## 43 Tennessee 39.07 59.48 37.5 45.3
## 44 Texas 41.37 57.20 38.1 44.3
## 45 Utah 24.91 72.69 23.7 31.9
## 46 Vermont 66.92 30.80 61.4 71.0
## 47 Virginia 50.57 47.85 48.2 53.2
## 48 Washington 55.22 42.75 52.7 59.7
## 49 West Virginia 35.52 62.32 36.5 46.1
## 50 Wisconsin 52.75 46.13 49.5 55.3
## 51 Wyoming 27.86 68.62 24.9 36.9
## romney.min romney.max wrong.obama wrong.romney
## 1 59.0 66.6 0 0
## 2 53.8 65.8 0 0
## 3 49.8 56.4 0 0
## 4 56.0 63.6 0 0
## 5 37.8 43.6 0 0
## 6 45.3 51.3 0 0
## 7 39.2 45.8 1 1
## 8 34.3 45.3 0 0
## 9 3.2 9.6 0 0
## 10 47.1 52.5 0 0
## 11 51.5 56.9 0 0
## 12 28.8 36.6 1 1
## 13 61.7 70.7 0 0
## 14 36.6 42.6 0 0
## 15 51.0 57.0 0 0
## 16 44.7 51.1 0 0
## 17 55.0 67.2 0 0
## 18 54.3 63.3 0 0
## 19 56.4 63.4 0 0
## 20 39.4 46.6 0 0
## 21 35.1 41.1 0 0
## 22 36.1 43.7 0 0
## 23 43.2 48.6 0 0
## 24 42.2 48.0 0 0
## 25 55.0 65.4 0 0
## 26 50.8 56.6 0 0
## 27 49.3 57.1 0 0
## 28 55.6 62.2 0 0
## 29 44.3 50.3 0 0
## 30 44.4 51.4 0 0
## 31 40.2 46.8 0 0
## 32 41.1 48.3 0 0
## 33 34.1 39.9 0 0
## 34 48.0 53.2 0 0
## 35 52.8 60.6 0 0
## 36 45.0 50.4 0 0
## 37 62.1 69.7 0 0
## 38 40.4 47.8 0 0
## 39 44.0 49.2 0 0
## 40 32.1 40.7 0 0
## 41 51.6 60.6 0 0
## 42 52.0 60.4 0 0
## 43 53.9 61.7 0 0
## 44 55.1 61.3 0 0
## 45 66.5 74.7 0 0
## 46 27.9 37.5 0 0
## 47 46.2 51.2 0 0
## 48 39.1 46.1 0 0
## 49 52.7 62.3 1 1
## 50 44.0 49.8 0 0
## 51 61.7 73.7 0 0
par(mar=c(아래,왼쪽,위,오른쪽))으로 Outer Margin Area까지의 여백을 지정할수있다.
par(mar = c(0, 0, 0, 0)) ##Outer Margin Area까지의 여백을 0으로 지정
이 분석에서는 x,y의 상관관계를 그리기 위한 plot이 아니다.따라서 x,y를 NULL로 지정하고 만들 plot의 x,y축 범위를 xlim,ylim를 통해 설정하고 x,y축을그리지 않기때문에 yaxt,xaxt옵션으로 “n"로 지정한다.
plot(NULL, xlim = c(-30, 100), ylim = c(-1, 54), yaxt = "n", ann = FALSE, xaxt = "n",
bty = "n")
text(x축,y축) 이때 pos와 cex옵션을 추가할수있다.— pos는 pos=1 or 2 or 3 or 4 를 통해 지정된 자표보다 순서대로 아래,왼쪽,위,오른쪽으로에 text를 첨가할수있다 — cex는 text의 크기를 설정할수있다.
text(50, 53, "Comparison of Nate Silver Forecasts and Results", pos = 3)
rect(x축 시작,y축 시작,x축 끝,y축 끝) 범위를 넣고 col 옵션으로 채워넣을 색을 선택하여 사각형을 만들수있다. —border=T 일경우 그려진 사각형에 테두리를 그릴수있다. —아래 함수는 loop를 이용하여 y축에 2줄 간격으로 사각형을 그리고있다.
for (i in seq(from = 1, to = 51, by = 2)) {
rect(-26, i - 0.5, 100, i + 0.5, col = "#DDDDDD33", border = NA)
}
segments(x축시작,y축시작,x축 끝,y축 끝) 으로 x,y축의 범위를 지정하여 선을 그릴수있다.— 옵션으로는 col,lty,lwd를 지정할수있다.— 아래 코드에서는 loop를 통하여 x축 10단위마다 y축은 0.5부터-51.5까지 선을그리는 코드다.
for (i in seq(from = 10, to = 90, by = 10)) {
segments(i, 0.5, i, 51.5, col = "#CCCCCC66")
text(i, 51, paste(i, "%", sep = ""), cex = 0.4, pos = 3)
}
segments(50, -0.5, 50, 51.5, col = "#00FF0033")
points()
points(x,y,cex,pch)
points() 는 지정된 좌표에 pch를 통해 다양한 symbol을 입력할수있다.
코드 설명— State를 위에서 부터 입력하기위해 j<-52-i를 만들어 y축 좌표를 설정하였고— segments로 그린 두 직선(각각의 min-max)이 겹치지 않기 위해 j-0.3,j-0.1로 다르게 지정하였다.— if() 를써서 예측이 틀린곳은 (2,j)위치에 지정된색으로 *를 표시한다. 마지막으로 points()를 이용하여 예측범위 위에 실제 결과를 symbol로 표시하였다.
for (i in seq_along(silver$State)) {
j <- 52 - i
segments(silver$obama.min[i], j - 0.3, silver$obama.max[i], j - 0.3, col = "blue")
segments(silver$romney.min[i], j - 0.1, silver$romney.max[i], j - 0.1, col = "red")
text(0, j, silver$State[i], cex = 0.7, pos = 2)
if (silver$wrong.obama[i]) {
text(2, j, "*", col = "blue", cex = 0.7, pos = 2)
}
if (silver$wrong.romney[i]) {
text(4, j, "*", col = "red", cex = 0.7, pos = 2)
}
points(silver$result.obama[i], j + 0, cex = 0.6, pch = 25, col = "#0000FFAA",
bg = "#0000FFAA")
points(silver$result.romney[i], j + 0.2, cex = 0.6, pch = 25, col = "#FF0000AA",
bg = "#FF0000AA")
}
그려진 plot 아래 segments(),text(),points()이용하여 plot에 사용된 기호를 정리하였다.
segments(12, -1, 22, -1, col = "blue")
segments(12, -0.8, 22, -0.8, col = "red")
text(22, -1, "Forecasts", pos = 4, cex = 0.7)
points(60, -0.7, cex = 0.6, pch = 25, col = "#FF0000AA", bg = "#FF0000AA")
points(62, -0.7, cex = 0.6, pch = 25, col = "#0000FFAA", bg = "#0000FFAA")
text(63, -1, "Election Results", pos = 4, cex = 0.7)
par(mar = c(5.1, 4.1, 4.1, 2.1))
결과
silver <- read.csv("C:\\Users\\ms\\Desktop\\silver.csv", header = T)
silver$wrong.obama <- ifelse(silver$result.obama >= silver$obama.min & silver$result.obama <=
silver$obama.max, 0, 1)
silver$wrong.romney <- ifelse(silver$result.romney >= silver$romney.min & silver$result.romney <=
silver$romney.max, 0, 1)
par(mar = c(0, 0, 0, 0))
plot(NULL, xlim = c(-30, 100), ylim = c(-1, 54), yaxt = "n", ann = FALSE, xaxt = "n",
bty = "n")
text(50, 53, "Comparison of Nate Silver Forecasts and Results", pos = 3)
for (i in seq(from = 1, to = 51, by = 2)) {
rect(-26, i - 0.5, 100, i + 0.5, col = "#DDDDDD33", border = NA)
}
for (i in seq(from = 10, to = 90, by = 10)) {
segments(i, 0.5, i, 51.5, col = "#CCCCCC66")
text(i, 51, paste(i, "%", sep = ""), cex = 0.4, pos = 3)
}
segments(50, -0.5, 50, 51.5, col = "#00FF0033")
for (i in seq_along(silver$State)) {
j <- 52 - i
segments(silver$obama.min[i], j - 0.3, silver$obama.max[i], j - 0.3, col = "blue")
segments(silver$romney.min[i], j - 0.1, silver$romney.max[i], j - 0.1, col = "red")
text(0, j, silver$State[i], cex = 0.7, pos = 2)
if (silver$wrong.obama[i]) {
text(2, j, "*", col = "blue", cex = 0.7, pos = 2)
}
if (silver$wrong.romney[i]) {
text(4, j, "*", col = "red", cex = 0.7, pos = 2)
}
points(silver$result.obama[i], j + 0, cex = 0.6, pch = 25, col = "#0000FFAA",
bg = "#0000FFAA")
points(silver$result.romney[i], j + 0.2, cex = 0.6, pch = 25, col = "#FF0000AA",
bg = "#FF0000AA")
}
segments(12, -1, 22, -1, col = "blue")
segments(12, -0.8, 22, -0.8, col = "red")
text(22, -1, "Forecasts", pos = 4, cex = 0.7)
points(60, -0.7, cex = 0.6, pch = 25, col = "#FF0000AA", bg = "#FF0000AA")
points(62, -0.7, cex = 0.6, pch = 25, col = "#0000FFAA", bg = "#0000FFAA")
text(63, -1, "Election Results", pos = 4, cex = 0.7)
par(mar = c(5.1, 4.1, 4.1, 2.1))