Review

# 내장 데이터 iris3 불러오기
data(iris3)

# iris3의 데이터 구조 파악하기
str(iris3)

# iris3의 세 번째 페이지의 행의 수 구하기
nrow(iris[,,3])

# iris3의 세 번째 페이지의 변수 Sepal L.의 분산 구하기
var(iris3[,"Sepal L.",3])

# 값 "A", "B", "C"를 중복 허락하여 iris3의 세 번째 페이지의 행의 수만큼 추출한 벡터 label 생성하기
label = sample(c("A", "B", "C")nrow(iri3[,,3]), replace = True)

 

외부 데이터 불러오기

read.csv(file, header = TRUE, ..)

read_excel(path, col_names = TRUE, ...)
read_xls()
read_xlsx()

# readxl 패키지에 포함된 함수들은 패키지 설치가 필요함.
install.packages("readxl")
library(readxl)

 

csv 파일로 불러오는걸 선호하기 때문에 csv파일로 불러오는 걸 공부하겠음.

excel

### install readxl ----
install.packages("readxl")
library(readxl)

### loading excel ----
read_xlsx("C:\\Users\\user\\OneDrive - 경북대학교\\통계학과\\1-2\\R프로그래밍 및 실험\\w5_1 covid19_psyco.xlsx")

read_xlsx("C:\\Users\\user\\OneDrive - 경북대학교\\통계학과\\1-2\\R프로그래밍 및 실험\\w5_1 covid19_psyco.xlsx", col_names = T)

readxl:: read_excel("C:\\Users\\user\\OneDrive - 경북대학교\\통계학과\\1-2\\R프로그래밍 및 실험\\w5_1 covid19_psyco.xlsx", sheet = 2)

readxl:: read_excel("C:\\Users\\user\\OneDrive - 경북대학교\\통계학과\\1-2\\R프로그래밍 및 실험\\w5_1 covid19_psyco.xlsx", na = "NA")

readxl:: read_excel("C:\\Users\\user\\OneDrive - 경북대학교\\통계학과\\1-2\\R프로그래밍 및 실험\\w5_1 covid19_psyco.xlsx", na = "7")

 

csv 파일로 불러오는걸 선호하기 때문에 csv파일로 불러오는 걸 공부하겠음.

 

csv

setwd("C:\\Users\\user\\OneDrive - 경북대학교\\통계학과\\1-2\\R프로그래밍 및 실험")
# 내가 어디 폴더에서 파일을 가지고 작업을 수행할지 정해줌.
# 자기 파일 클릭하고 우클릭하면 속성이 있는데 거기서 파일이 어딨는지 정보가 있으니
# 그걸 복사 붙여넣기하면 됨. 
# 근데 처음에 복사하면 \ 가 한 개만 나오는데 
# \를 \\이렇게 만들어줘야함. 

temp = read.csv("w5_1 covid19_psyco.csv", header =FALSE) 
# 파일 불러오기
# header는 column_names를 변수로 쓸건지 아닌지 FALSE는 안 쓴다는거
str(temp) 
head(temp, n = 5)
tail(temp)
temp$X ; temp$travel.work
unique(temp$age)
10 %in% temp$time_dp
5:10 %in% temp$time_dp
5:10 %in% head(temp$time_dp)

# temp에서 temp$X, temp$travel.work 열을 제거한 데이터 프레임 example 생성하기
example = temp[, -c(20,22)]
example = temp[, !(names(temp) %in% c("X", "travel.work"))]
example = subset(temp, select = -c(X, travel.work))

 

EDA

summary(example)

table(example$prefer)
table(example$age, example$prefer)

hist(example$time_bp)
hist(example$home_env)

example$certaindays_hw = as.factor(example$certaindays_hw)
str(example)

 

Practice1

# temp의 변수 age 내 오타를 수정하고 확인
temp[temp$age == "Dec-18"] == "12-18"

# na개수
sum(is.na(temp$X)) 
sum(is.na(temp$travel.work))

# na개수와 temp의 행의 수가 같은지 확인
sum(is.na(temp$X)) == nrow(temp)
sum(is.na(temp$travel.work)) == nrow(temp)

 

Practice2

names(temp) 
# 를 통해서 X와 travel.work이 column의 몇 번째인지 알아보기

example = temp[,-c(20,22)]
example = temp[,!(names(temp) %in% c("X", "travel.work")]
exmaple = subset(temp, select = -c(X, travel.work))

# subset(x, select,...)
## x : object to be subsetted
## select : expression, indicating columns to select from a dataframe
### 여기서 select 안에 있는 column의 변수들은 "" 표시 X

 

파일 내보내기

setwd("C:\\Users\\user\\OneDrive - 경북대학교\\통계학과\\1-2\\R프로그래밍 및 실험")

result = table(example$age, example$prefer) 
# age가 행 부분이 되고, prefer이 열 부분이 됨. 

write.csv(result, file = "table.csv")
# result라는 데이터 프레임을 csv로 저장  
write.csv(table(example$age, example$prefer), file = "table2.csv")
 
write.csv(example[1:3, 1:4], file = "dataframe.csv")
# example의 1부터 3부분의 행과 1부터 4의 열을 추출해서 csv 파일로 만들고 파일 이름은 dataframe.csv

 

리스트 저장하기

write.csv(list(a = example[1:10, 1:4], b = 1:10),
          file = "list1.csv")

이런 식으로 저장됨.

 

write.csv(list(a = example[1:10, 1:4], b = 1:5),
		file = "list2.csv")

 

1번째 데이터 프레임과 2번째 데이터 프레임의 F열 값이 다르다는 것을 확인할 수 있음.

이게 왜냐면 

write.csv(list(a = example[1:10, 1:4], b = 1:10),
          file = "list1.csv")
write.csv(list(a = example[1:10, 1:4], b = 1:5),
		file = "list2.csv")

10개의 행을 불러오는건 둘 다 같은데, b의 값이 1부터 10까지인거랑 b가 1부터 5까지인 것에서 차이가 난다는 걸 확인할 수 있음. 

 

다른 방법

erer::write.list(list(a = example[1:3,1:4], b = 1:10), file = "list_.csv") # a가 행으로 들어감.

 

 

.rdata

### rdata 
setwd("C:\\Users\\user\\OneDrive - 경북대학교\\통계학과\\1-2\\R프로그래밍 및 실험")
save(result, file = "rda file.rda") 
# save(result, file = "rda file.rdata")
# R의 고유한 저장형식
# 현재까지 작업한 환경을 현 작업공간(working directory)에 저장함.

save.image(file = "image.rda")
# 현재 작업 중인 공간 전체를 저장 
load("image.rda")
load("rda file.rda")
# "로드"는 외부 파일에 저장된 데이터나 객체를 R 프로그램에서 사용할 수 있도록 가져오는 과정

 

load의 사용

기존의 global Environment는 이런 상태임.

그런데

load("image.rda")

해주면

이렇게 생김.

전에 있던 파일의 저장된 데이터와 객체를 가져와줄 수 있도록 함. 

Review

A = matrix(seq(-5, 5, length = 25))
B = matrix(seq(5, 10, length = 25))
det A ; det B
A %*% B
k = matrix(0, nr = 3, nc = 3) 
# matrix(c(1,0,0,0,1,0,0,0,1), nr =3)
diag(k) = 1 #(diagonal elements - 대각성분)

 

R에서 데이터 만들기

(출처: Psycological Effects of COVID Answers to survey taken in 2020 to understand people's opinion on lockdown kaggle.com/datasets/psycological-effects-of-covid)

ex = data.frame(
    age = c("19-25", "26-32", "50-60", "19-25", "40-50", "12-18"),
    gender = c("Male", "Female", "Female", "Male", "Female", "Male"),
    occupation = c("Student in College", 
                   "Working Professional", 
                   "Homemaker",
                   "Student in College",
                   "Working Professional",
                   "Student in College"),
    sleep_bal = c(-0.5, 0, -0.5, 0, 0, -1),
    fam_connect = c(0.5, 0, -0.5, 0.5, 0.5, 0.5),
    relaxed = c(0.5, 0, -0.5, 0, 0.5, 0),
    prefer = c("Work/study from home", "Complete Physical Attendance", "Work/study from home","Work/study from home", "Complete Physical Attendance", "Complete Physical Attendance")
)

 

만든 데이터로 연습하기

# ex의 행과 열의 개수 확인하기
nr(ex) ; nc(ex)

# ex의 변수명을 변경하기
#1
names(ex) = c("age", "gender", "occup", "sleep", "family", "relax", "prefer")

#2
names(ex)[3:6] = c("occup", "sleep", "family", "relax")

# ex의 변수 prefer의 값들을 간단하게 나타내기
ex$prefer[ex$prefer == "Work/study from home"] = "from home"
ex$prefer[ex$prefer == "Complete Physical Attendance"] = "attendance"

 

내장 데이터 불러내기

1. iris

data(iris) # 데이터를 불러줌.
str(iris) # 데이터가 어떤 구조로 형성되어있는지 알려줌.
head(iris) # 데이터의 값들 중 위에서부터 6개의 데이터를 가져와서 나타냄.

sum(is.na(iris$Sepal.Length)) ; sum(is.na(iris$Sepal.Width))
sum(is.na(iris$Petal.Length))   # 각 열의 데이터를 조사해서 결측값(na)값이 있는지 확인

mean(iris$Sepal.Length) # 평균
var(iris$Sepal.Length) # 분산
sd(iris$Sepal.Length) # 표준편차

 

2. mtcars

data(cars); rm(cars)
data(mtcars); head(mtcars)

max(mtcars$cyl)    # 최댓값
min(mtcars$cyl)	   # 최솟값
unique(mtcars$cyl) # cyl의 값을 골라줌. 근데 중복포함 하지않고 골라줌.

 

데이터에 접근하는 방법

# 접근할 데이터[행 선택, 열 선택 (열 이름도 가능)]

mtcars[1:3, ]
mtcars[ ,1:2]
mtcars[1:5, 2:3]
mtcars[1:3, c("mpg", "cyl")]

 

Subsampling

sample(1:nrow(mtcars), size = 10)   # 중복 포함 x, replace = FALSE(기본값)
sample(1:nrow(mtcars), size = 10, replace = TRUE) # 중복 포함 

set.seed(10) 
# 이걸 쓰고 sample을 쓰면 다시 set.seed(10)을 쓰고 sample을 쓰면 처음에 했던 sample이 나옴. 
# (size에 따라서 앞에서부터 차례대로)

mtcars_part = mtcars[sample(1:nrow(mtcars), size = 10),] 
# mtcars_part에 mtcars에서 샘플링한거를 저장할건데, 샘플링을 어떻게 하냐면, 행 10개를 추출할거임.
# 근데 행이 1부터 mtcars의 마지막까지 중에서 smaple을 취할거임.
# 중복포함 x

 

연습하기

# mtcars에서 5,10,15번 째 관찰값(행)의 hp, gear, carb(열)의 값을 출력
mtcars[c(5, 10, 15), c("hp", "gear", "carb")]

# mtcars에서 6개의 관찰값을 임의로 중복 없이 추출하기
mtcars[sample(1:nrow(mtcars), size = 6, replace =FALSE), ]

# mtcars에서 6개의 관찰값을 임의로 중복을 허락하여 추출하기
mtcars[sample(1:nrow(mtcars), size = 6, replace =TRUE), ]

# mtcars에서 cylinder의 개수가 가장 적은 관찰값을 골라 출력하기
min(mtcars$cyl)

# mtcars에서 cylinder의 개수가 가장 적은 관찰값의 gear 개수의 평균을 구하기
mean(mtcars[mtcars$cyl == min(mtcars$cyl), "gear"]) # 행 접근 후 열 접근
mean(mtcars[mtcars$cyl == min(mtcars$cyl), ]$gear) 

# mtcars에서 cylinder의 개수가 
# 가장 적은 관찰값의 변수 vs의 값이 0이면 "V-shaped", 1이면 "straight"로 변경하기
mtcars$vs[mtcars[mtcars$cyl == min(mtcars$cyl), "vs"] == 0] = "V-shaped"
mtcars[mtcars$cyl == min(mtcars$cyl) & mtcars$vs == 0 , "vs"] = "V-shaped"

mtcars$vs[mtcars[mtcars$cyl == min(mtcars$cyl), "vs"] == 1] = "straight"
mtcars[mtcars$cyl == min(mtcars$cyl) & mtcars$vs == 1 , "vs"] = "straight"

 

내장데이터 확인

data.list = data(package = .packages(all.available = TRUE))
str(data.list)
head(data.list)
head(data.list$result)

 

+ Recent posts