행정구역이 시와 군인 데이터에서 순이동이 양수인 데이터만 추출.
열은 행정구역과 순이동만 나오게 한다.
hw <- read.csv(file.choose(), sep = ",", header = T) # 파일은 선택, 쉼표로 구분, 헤더 있음.
hw # 데이터 확인
head(hw) # 상위 데이터 요약
tail(hw) # 하위 데이터 요약
x <- grep("시$", hw$행정구역.시군구.별) # 데이터에서 시로 끝나는 데이터 행 번호 반환
x
y <- grep("군$", hw$행정구역.시군구.별) # 데이터에서 군으로 끝나는 데이터 행 번호 반환
y
data1 <- hw[x, ] # x에 있는 행 번호를 가진 데이터를 data1로
data1
data2 <- hw[y, ] # y에 있는 행 번호를 가진 데이터를 data2로
data2
s <- grep("자치시$", hw$행정구역.시군구.별)
# 세종특별자치시가 2개 이기에 하나만 사용하기 위해 열 번호 알아보기
s
data1 <- subset(data1, 행정구역.시군구.별 != "세종특별자치시")
# 시 데이터에서 세종특별자치시를 전부 제거 후
datas <- hw[84, ] # 아까 알아놓은 행 번호 중 하나를 변수에 선언해서
data1 <- rbind(datas, data1) # 시데이터와 세종특별자치시 한개의 데이터를 병합
data1
# 혹은 data1에서의 세종특별자치시의 행번호를 알아본 뒤 data1 <- data1[-c(n), ]
행번호 n ( 세종특별자치시 하나) 만 빼고 전부.
data <- rbind(data1, data2) # 시데이터와 군데이터를 병합
data <- subset(data, 순이동.명. > 0)
# 데이터에서 순이동이 양수인 데이터만 남기기
data
# 혹은 data <- data[data$순이동.명. > 0, ] data에서 순이동이 0보다 큰 데이터의 행 전부.
df <- data.frame(행정구역 = data$행정구역.시군구.별, 순이동 = data$순이동.명.)
# 열 이름을 행정구역과 순이동으로 하고 데이터를 가져와서 데이터 프레임으로
df # 숙제 데이터 완성.
setwd("C:/bigdataR/write csv") # 저장 디렉토리 설정
write.csv(x = df, file = "Move_July.csv", row.names = F)
# 저장할 데이터, 저장할 파일이름, 행번호는 없이.
1) 산술 연산자
num1 <- 100
num2 <- 20
result <- num1/num2 # 나누기 연산
result
result <- num1%%num2 # 나머지 연산
result
result <- num1^2 # 거듭제곱 연산
result
result <- num1**2
result
2) 관계 연산자
결과는 T / F
== Equal
!= Not Equal
> Greater Than
< Less Than
>= Greater Than or Equal
<= Less Than or Equal
3) 논리 연산자
결과는 T / F
& AND
| OR
! NOT
num1 <- 30
result <- !(num1 == 20) # 관계식은 F지만 ! 가 있기에 T 가 반환
result # T
# xor(x,y) x != y -> T / x == y -> F
x <- T
y <- F
z <- T
xor(x, y) # T
xor(x, z) # F
if(조건){참인 경우} else{거짓인 경우}
x <- 50
y <- 4
z <- x*y
if( z >= 40 ){
cat("40 이상\n") # 조건이 참이면 / "\n" 은 줄바꿈
cat("x * y =", z) # cat은 원하는 포맷으로 출력 가능 / 줄바꿈을 설정하지 않으면 이어서 출력됨
}else{
cat("40 미만") # 조건이 거짓이면
}
if(조건){참인 경우} else if(조건){이전 조건은 거짓이지만 현재 조건은 참인 경우} else {거짓인 경우}
x <- scan() # x의 값을 입력 받아
if( x > 100 ){
result <- "100 초과" # x가 첫번째 조건에 참일 경우
}else if( x > 50 ){
result <- "100 이하 50 초과"
# x가 첫번째에는 거짓, 이번에는 참일 경우
}else if( x > 0 ){
result <- "50 이하 0 초과"
# x가 첫번째, 두번째에는 거짓, 이번에는 참일 경우
}else{
result <- "0 이하" # x가 모든 경우에 거짓일 경우
}
cat(result) # result를 출력
ifelse( 조건, 참인 경우 출력, 거짓인 경우 출력 )
: 여러 값을 가진 벡터 데이터에 적용할 경우 각각 요소에 관해 적용 된다.
x <- scan() # x의 값을 입력 받아
y <- ifelse(x >= 20, "20 이상", "20 미만")
# 각 결과에서 출력을 원하는 값을 입력
cat(y) # 받은 값을 출력
swith( 비교문, 실행문1, ...)
: 실행문은 보통 key = value 형태
: key를 비교하여 실행문의 value를 반환
a <- "a"
switch( a, a = 12, b = 55, c = 100)
# 비교문과 비교하여 동일한 요소를 가진 실행문의 값을 반환
# 동일한 요소가 없다면 아무것도 반환 되지 않는다.
which(조건)
: 조건이 참이 되는 요소의 인덱스 값 반환
x <- c( 1,2,3,4,5,6,7,8,9 )
y <- which( x == 1 ) # x가 1인 요소의 인덱스 반환
z <- which( x != 5 ) # x가 5가 아닌 요소들의 인덱스 반환
# 요소가 없다면 0 반환
x[y]
x[z]
for(n in 변수){실행문}
: 변수에 있는 요소를 하나씩 n으로 넘겨 변수의 요소가 다 넘겨질 때까지 실행문을 반복
i <- c( 1:5 )
for( n in i ){
print( n ) # i의 요소가 하나씩 n으로 넘겨져서 출력됨 -> 1 2 3 4 5
} # print는 변수의 값 또는 연산 결과를 출력 / 자동으로 줄바꿈 실행
x <- 0
for( n in c( 1:10 ) ){ # x에 n이 하나씩 더해지면서
x <- x + n # x에는 결과적으로 총합이 들어간다.
} # 반복문에는 next ( == 파이썬의 continue) 가 사용 가능하다.
print( x ) # 1:10 이 더해져 55 출력
for(n in c(names(데이터프레임))){ print(n) }
: 위를 사용하면 데이터프레임의 열 이름 출력 가능
for(n in 100){cat(i)} => 100
score <- c(88:90) # 점수와 이름은 위치에 따라 서로 대응 된다.
name <- c("a","b","c")
i <- 1 # 카운터를 위해 1 넣기
for( s in score ){
cat( name[i], "->", s,"\n" )
# 1에 들어있는 이름이 출력될 때 첫번째 점수 또한 같이 출력된다.
i <- i + 1 # 다음 반복에는 2의 이름을 출력하기 위해 i에 1을 더해 i의 값으로 넣기
} # a -> 88 b -> 89 c -> 90
while(조건){ 실행문 }
: 조건이 T일 경우는 반복, 조건이 F일 경우는 멈춤.
n <- 0 # 카운터를 위해 1 넣기
while( n < 10 ){ # 매 반복 마다 n은 1씩 커짐
n <- n + 1 # 1 2 3 4 5 6 7 8 9 10
print(n)
}
1) 사용자 정의 함수
함수명 <- functino(매개변수){실행문}
f1 <- function(){ # 매개변수 없이 정의
cat("매개변수 없음")
}
f1() # 함수 실행
f2 <- function(x, y){ # 매개변수 2개 사용 가능
xy <- x+y
return (xy) # 값 반환
}
f2(3, 7) # 매개변수 부분에 인수를 넣어 함수 실행
2) 기술통계량을 계산하는 함수 정의
test <- quakes$mag # 테스트 데이터셋 불러오기
test
# 표본분산 식 var <- sum((x - 산술평균)^2) / (n-1)
# 표본본표준편차 식 sqrt(var)
# 편차 = 평균하고 변량의 차이
# 분산 = 각 편차의 제곱의 평균
# 표준편차 = 분산의 음이 아닌 제곱근
# 분산과 표준편차의 값이 크다 == 변량들이 중심으로 부터 넓게 흩어져있다.
# 분산과 표준편차의 값이 작다 == 변량들이 중심으로 모여있다.
var_sd <- function(x){
var <- sum((x - mean(x))^2) / (length(x)-1)
# x - mean(x) : 각각 편차를 구함 == 시그마
sd <- sqrt(var) # sqrt() : 분산에 루트 == 표준편차
cat("표본 분산 ", var,"\n")
cat("표본 표준편차 ", sd)
}
sd(test) # 표준편차 구하는 함수로 검증
var_sd(test)
3) 결측치 포함 자료의 평균 계산 함수 정의
data <- c(50, 10, 20, NA, 60, 70, NA, 30, NA, 80, 90, NA, 100, 40)
na1 <- function(x){
print(x)
print(mean(x, na.rm = T))
# NA를 제거 후 나머지 항목 평균 구함
}
na2 <- function(x){
x <- ifelse(!is.na(x), x, 0)
# NA를 0으로 바꾼 후 평균 구함
print(x) # 데이터 손실 예방
print(mean(x)) # 보통 사용 하지 않는 방법
}
na3 <- function(x){
x <- ifelse(!is.na(x), x, round(mean(x, na.rm = T), 2))
# NA를 제거한 후 나오는 평균을 NA에 대입하여 평균 구함
print(x) # NA가 평균에 영향을 끼치지 못함
print(mean(x)) # 데이터 손실 예방
}
na1(data) # 55
na2(data) # 39.28571
na3(data) # 55
1) 기술 통계량 처리 관련
x <- c(55,62,57,11,24,8,6,8,95,44,100)
min(x) # 최소값
max(x) # 최대값
mean(x) # 평균
median(x) # 중앙값
sum(x) # 총 합계
sd(x) # 표준 편차
sample(x, 3) # 3개의 샘플데이터를 뽑음음
table(x) # 빈도수
summary(x) #기초 통계량
library(RSADBE)
data("Bug_Metrics_Software")
# 샘플 데이터셋 불러오기
rowSums(Bug_Metrics_Software[ , , 1])
# 행 기준 합계
rowMeans(Bug_Metrics_Software[ , , 1])
# 행 기준 평균
colSums(Bug_Metrics_Software[ , , 1])
# 열 기준 합계
colMeans(Bug_Metrics_Software[ , , 1])
# 열 기준 평균
# rnorm(변량수, 평균, 표준편차) -> 정규분포의 난수 생성
# runif(변량수, 최소, 최대) -> 균등분포의 난수 생성
# rbinom(변량수, 범위, 확률) -> 이항분포의 난수 생성
data <- rnorm(1000, mean = 5, sd = 1)
# 1000개의 평균이 5이고 표준편차가 1인 데이터들
hist(data) # 그래프를 나타내는 함수. 해당 함수는 정규분포를 띄게 된다.
data <- runif(1000, 0, 10)
# 1000개의 최소가 0이고 최대가 10인 데이터들
hist(data) # 균등 분포
data <- rbinom(1000, 2, 0.5)
# 1000개의 0이나 1이나 2인 데이터들
# 확률이 작아질 수록 0이 더 많이 나오고
# 확률이 커질 수록 2가 더 많이 나온다.
hist(data) # 이항 분포
# set.seed(임의의 정수) -> 정수를 종자값으로 동일한 난수 생성
set.seed(100)
rnorm(3, mean = 5, sd = 1)
# 4.497808 5.131531 4.921083
set.seed(100)
rnorm(3, mean = 5, sd = 1)
# 4.497808 5.131531 4.921083
# 종자값이 같으면 난수가 같다.
2) 수학 관련
abs(x) # 절대값
sqrt(x) # 제곱근
ceiling(x) # 올림
floor(x) # 내림
round(x) # 반올림
3) 행렬연산 관련
x <- matrix(1:9, nrow = 3, ncol = 3, byrow = T)
y <- matrix(4:12, nrow = 3, ncol = 3)
cbind(x, y) # 열 기준으로 병합 (xy)
rbind(x, y) # 행 기준으로 병합 (x)
# (y)
ncol(x) # 열 개수
nrow(x) # 행 개수
apply(x, 1, sum) # 행렬, 1은 행 기준, 2는 열 기준으로 함수 적용
t(x) # 전치행렬 -> 행 기준은 열 기준으로, 열 기준은 행 기준으로
diag(x) # 대각행렬 -> 대각선 (\) 방향에 있는 요소로 이루어진 행렬
4) 집합연산 관련
union(x, y) # 합집합 ( 중복 없음 )
intersect(x, y) # 교집합
setdiff(x, y) # 차집합
3%in%y # 3이 y의 요소 인지 검사 => F