엑셀파일을 읽고 쓰려면 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"))))
'프로그래밍 공부 > R' 카테고리의 다른 글
R 공부 Day 5 데이터 전처리, %>% 파이프 연산자, 데이터 정제 (0) | 2020.05.28 |
---|---|
R 공부 Day 3 Data frame과 액셀 파일 불러오기 (0) | 2020.05.26 |
R 공부 Day 2 변수의 종류와, 기본 함수 (0) | 2020.05.26 |