[ R ] 003

이하나·2022년 9월 2일

R

목록 보기
3/4

[ 1 ] 숙제 검토

행정구역이 시와 군인 데이터에서 순이동이 양수인 데이터만 추출.
열은 행정구역과 순이동만 나오게 한다.

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)
                                                     # 저장할 데이터, 저장할 파일이름, 행번호는 없이.

[ 2 ] 연산자

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

[ 3 ] 조건문

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]

[ 4 ] 반복문

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)
}

[ 5 ] 함수 정의

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

[ 6 ] 주요 내장함수

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
profile
코딩을 배우는 비전공자 코린이!

0개의 댓글