엑셀파일을 읽고 쓰려면 xlsx 설치해야 합니다.
xlsx 패키지는 자바JDK를 설치해야 사용이 가능합니다.

자바 jdk 다운로드 링크:

https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

설치를 한후에 install 함수를 이용해서 rJava랑 xlsx를 다운 받아 줍니다.

install.packages("rJava")
install.packages('xlsx')

 

library(rJava)
library(xlsx)

 

Sys.setenv(JAVA_HOME = 'C:\\Program Files\\Java\\jdk1.8.0_251')

library(readxl)

excel_exam <- read_excel('excel_exam.xlsx',sheet='Sheet2')

excel_exam <- as.data.frame(excel_exam)

write.xlsx(excel_exam, "df_excel_exam.xlsx")

 

문제 1-1 아래와 같이 구성되는 2행 2열 매트릭스 alpha를 생성합니다.

      [,1] [,2] [,3]
[1,] "a"  "c"  "e"
[2,] "b"  "d"  "f"

alpha <- matrix(letters[1:6], norow = 2)

 

문제 1-2. 'x', 'y', 'z'라는 행을 추가합니다.

alpha <- rbind(alpha, c("x","y","z"))

 

문제 1-3 's', 'p' 라는 열을 추가합니다.

alpha <- cbind(alpha, c('s','p')

 

문제2. 아래와 같이 값이 구성되는 데이터프레임을 정의하여 df1에 저장합니다.
   x   y
1  1   2
2  2   4
3  3   6
4  4   8
5  5  10

df1 <- data.frame(x=1:5, y= seq(2,10,2))

 


문제3. 아래와 같이 값이 구성되는 데이터프레임을 정의하여 df2에 저장합니다.

   col1  col2 col3
1  1       a    6 
2  2       b    7
3  3       c    8
4  4       d    9
5  5       e   10

df2 <- data.frame(col1=1:5, col2= letters[1:5], col3 = 6:10)

 

문제4-1. data.frame()과 c()를 조합해서 표의 내용을 데이터 프레임으로 만들어 출력합니다.

제품        가격        판매량
사과        1800        24
딸기        1500        38
수박        3000        13

fruit_df <- data.frame( 제품 = c("사과","딸기","수박"), 가격 = c(1800,1500,3000), 판매량 = c(24,38,13))

 

문제4-2. 앞에서 만든 데이터 프레임을 이용하여 과일 가격 평균, 판매량 평균을 구합니다.

mean(fruit_df[,2])

mean(fruit_df[,3])

 

문제5-1. 다음 세 벡터를 이용하여 데이터프레임을 생성하고, gender 변수의 값을 반대 성별로 변경합니다. 그리고 name 변수는 문자, gender 변수는 팩터, math 변수는 숫자 데이터의 유형이라는 것을 확인합니다.

#   name <- c("류정원", "김사과", "오렌지", "반하나", "이멜론")
#   gender <- factor(c("M", "F", "M", "F", "M"))
#   math <- c(85, 76, 99, 88, 40)

name <- c("류정원", "김사과", "오렌지", "반하나", "이멜론") 

gender <- factor(c("M", "F", "M", "F", "M")) 

math <- c(85, 76, 99, 88, 40)

member_df <- data.frame(name, gender, math, stringsAsFactors = F)

* stringsAsFactors = F : Factor는 연산이 불가능 함으로 연산을 할 수 있도록 팩터를 없애준다

 

#ifelse() 함수 : 조건식이 만족(T)하면 앞에식을 실행, 만족하지 않으면(F) 뒤에 식을 실행합니다

member_df$gender <- factor(ifelse(member_df$gender == 'F',"M","F"))

 

class(member_df$name)
class(member_df$gender)
class(member_df$math)

 

# 위에서 만든 데이터프레임에 대해 아래 작업을 수행합니다.
# 문제 5-2 stat변수를 추가합니다. stat <- c(76,73,95,82,35)

member_df$stat <- c(76,73,95,82,35)

#파생 변수

 

문제 5-3 math변수와 stat 변수의 합을 구하여 score 변수에 저장합니다.

member_df$score <- member_df$math + member_df$stat

 

문제 5-4 논리 연산 인덱싱을 이용하여 score가 150이상이면 A, 

100 이상이면 150미만이면 B, 70이상 100미만이면 C등급을 부여하고 grade 변수에 저장합니다.

member_df$grade <- ifelse(member_df$score >= 150, "A", ifelse(member_df$score >= 100, "B", ifelse(member_df$score >= 70, "C", NA)))

 

array(배열) : 다차원, matrix로 구성되어 있습니다.  matrix가 여러개 있는 구조입니다.

# array() 함수를 이용해 만듭니다. dim속성을 이용하여 행, 열, 면의 순서로 array 구조를 지정합니다.

# array( ... dim = c(2,3,4)) -> 2행 3열 matrix가 4개 있다는 의미입니다.

arr1` <- array(c(1:24), dim = c(2,3,4)

 

* 배열의 요소 접근 : arr1[행, 열, matrix]

arr1[,,1] # array1에서 1번째 matrix의 데이터를 선택합니다.

arr1[1,,1] # array1에서 1번째 matrix의 첫번째 행 데이터를 선택합니다
arr1[,2,2] # array1에서 2번째 matrix의 두번째 열 데이터를 선택합니다
arr1[1,,] # array1에서 모든 matrix의 1번째 행 데이터를 선택합니다
arr1[1,2,] # array1에서 모든 matrix의 1행 2열 데이터를 선택합니다

 

list(리스트) : 다차원, 데이터 프레임으로 구성되어 있습니다.

# list() 함수를 이용해 만듭니다.

vec <- 1
mat <- matrix(c(1:12), ncol=6)

df <- data.frame(x1=c(1,2,3), x2= c ('a','b','c'))

arr <- array(c(1:20), dim=c(2,5,2))

li <- list(list1=vec, list2=mat, list3=arr, list4=df)

 

# 파생 변수 만들기 : 계산에 의해 데이터가 채워진 변수(열)

df_raw <- data.frame(var1 = c(1,2,1),var2 = c(2,3,4))

df_var <- df_raw #원본 데이터를 복사하며 df_var 변수에 저장합니다

 

# 파생 변수 만드는 방법 1 : 데이터프레임$파생변수

df_var$var_sum <- df_var$var1+ df_var$var2
df_var$var_mean <- df_var$var_sum / 2

 

df_excel_exam_copy <- excel_exam
df_excel_exam_copy$var_sum <- df_excel_exam_copy$math2 + df_excel_exam_copy$english2 +df_excel_exam_copy$science2
df_excel_exam_copy$var_mean <- df_excel_exam_copy$var_sum / 3

 

# subset() : 데이터프레임에서 특정 변수의 데이터만 뽑아낼 수 있습니다.
# subset(데이터프레임, select=시작변수명:끝변수명) # 연속적인 열 추출
# subset(데이터프레임, select=c(변수명, 변수명...)) # 비연속적인 열 추출

subset(df_excel_exam_copy, select = math2:science2)
subset(df_excel_exam_copy, select = c(math2,science2)) * df_excel_exam_copy[,c("math2","science2")] 랑 같음

 

# rowSums() : 행의 합계를 계산할 수 있습니다.
# rowMeans() : 행의 평균을 계산할 수 있습니다.

df_excel_exam_copy$var_sum2 <- rowSums(subset(df_excel_exam_copy, select = math2:science2))

 

# 파생 변수 만드는 법 2 : transfrom()

df_excel_exam_copy <- transfrom(df_excel_exam_copy, var_sum3 = rowSums(subset(df_excel_exam_copy, var_sum3 = rowSums(subset(df_excel_exam_copy,  select = math2:science2)))

 

# 파생 변수 만드는 법 3 : mutate() -> dplyr 패키지 안에 들어있음

한번에 여러개의 파생 변수를 추가할 수 있습니다.

%>% 연산자 : dplyr 패키지에 있는 대입문으로 왼쪽의 데이터를 오른쪽의 함수로 전달합니다.

%>% 왼쪽의 데이터프레임의 %>% 오른쪽 함수로 전달되기 때문에 데이터 프레임의 열을 사용해야 할 때 [데이터프레임$변수이름]과 같이 사용하지 않고 데이터 프레임 이름을 생략하여 변수명만 사용하면 됩니다

library(dplyr)

df_excel_exam_copy <- df_excel_exam_copy %>% mutate( var_sum = rowSums(subset(df_excel_exam_copy, select = math2 : science2)), var_mean = rowMeans(subset (df_excel_exam_copy, select = math2 : science2)))

 

ifelse() : 조건을 사용하여 파생 변수를 만들 수 있습니다.

평균 점수(var_mean)가 60점 이상이면 'pass', 그렇지 않으면 'fail'을 가지는 파생변수 result를 추가합니다.

df_excel_exam_copy$result <- ifelse (df_excel_exam_copy$var_mean >= 60, "pass","fail")

 

평균 점수가 90점 이상이면 "A", 80점이상이면 "B", 70점이상이면 "C", 60점이상이면 "D", 나머지는 "F"인 학점을 나타내는 grade 파생 변수를 추가합니다.

df_excel_exam_copy$grade <- ifelse(df_excel_exam_copy$var_mean >= 90, "a", ifelse(df_excel_exam_copy$var_mean >= 80, "B",ifelse(df_excel_exam_copy$var_mean >= 70, "C", ifelse(df_excel_exam_copy$var_mean >= 60, "D", "F"))))

+ Recent posts