2024. 9. 27. 17:38ㆍR분석
데이터 프레임
데이터프레임은 서로다른 형태의 데이터를 2차원 데이터의 테이블 형태로 묶을 수 있는 데이터구조이다. 2차원 데이터라는 점에서 행렬과 비슷하지만 데이터프레임은 리스트처럼 서로다른 자료형 저장이 가능하다.
데이터프레임 생성
#데이터프레임
#data.frame함수 사용(벡터1, 벡터2,...)
name <- c('둘리','도우너','또치') #문자열 벡터
rank <- c(1,2,3) #숫자형 벡터
stu.info <- data.frame(name,rank)
print(stu.info)
#문자형 벡터와 숫자형 벡터를결합하여 데이터프레임 생성
#합한 벡터들이 열방향으로 결합
#하나의 벡터는 데이터프레임에서 하나의 열이됨
stu_df <- data.frame(
#열제목 = 데이터
ID=1:5,
name=c('짱구','철수','훈이','맹구','유리'),
Age=c(5,6,7,5,6),
scores=c(75,92,88,79,95)
)#요소의개수는 전부 동일해야함. 아니면 에러!
print(stu_df)
print(class(stu_df)) #data.frame
데이터프레임을 생성할때는 data.frame의 함수를 사용하며, 열제목=데이터(벡터)의 형태로 값을 입력한다. 데이터에 열제목과 함께 전달된 벡터는 데이터프레임에서 하나의 열로 들어가며, 전달되는 벡터요소개수는 전부 동일한 값이여야한다. 동일하지않으면 에러가 발생하며, 데이프레임이 생성되지 않는다.
데이터 프레임 적용함수
#데이터프레임 적용 함수
#summary(): 데이터프레임의 각 열에 대한 요약 통계확인
print(summary(stu_df))
print(summary(stu.info))
#rownames(): 데이터프레임, 행렬에서 행이름 지정
rownames(stu_df) <- c('1번','2번','3번','4번','5번')
print(stu_df)
#colnames() : 데이터프레임, 행렬에서 열이름 지정
colnames(stu.info) <- c('이름','순위')
print(stu.info) #기존에 name과 rank가 이름,순위로 변경
summary
summary함수는 summary(데이터프레임)형태로 적으며, 결과로는 데이터프레임에 대한 요약통계를 반환한다. 숫자형의 경우에는 최소값, 최대값, 1사분위수 등을 반환하며 문자형의 경우에는 길이값이나 데이터타입 등을 반환한다.
rownames
rownames는 행의 이름을 부여할 수 있는 함수이다. 행에 행이름을 따로 부여하게되면 행이름으로 데이터값을 추출할 수 있게된다.
colnames
colnames의 경우 데이터프레임의 컬럼에 이름을 부여하는 방식이다. 하지만 행의 이름을 지정하는 rownames와는 달리 이미 데이터프레임을 만들때 컬럼명=벡터의 형식으로 만들기때문에 colnames을 통해 이름을 지정하게되면 기존에 데이터프레임을 만들때 지정해두었던 컬럼의 이름 자체가 변경되게 되므로 이점을 주의하여 사용하여야 한다.
데이터프레임 요소접근
#데이터프레임 요소접근
#1)행과 열의 인덱스번호 : 데이터프레임[행번호, 열번호]
print(stu_df)
print(stu_df[1,2])
print(stu_df[3,4])
print(stu_df[1,]) #행만 출력
print(stu_df[,2]) #열만 출력
#2)열 이름으로 접근 : 데이터프레임$열이름
print(stu_df$ID) #벡터형으로 가져옴
print(stu_df$name)
print(stu_df$scores)
print(stu_df$name[2]) #이름으로 접근후, 그 안에서 열의 두번째값
print(stu_df$ID[1])
#3)행이름으로 접근 : df['행이름',]
print(stu_df['3번',])
print(stu_df['1번',])
print(stu_df['4번',])
행과 열의 인덱스번호 : 데이터프레임[행번호, 열번호]
행과 열의 인덱스 번호로 데이터프레임의 요소값에 접근하는 방법은 기존 데이터구조에서 데이터 요소값에 접근하는 방법과 비슷하다. 데이터프레임명[행번호, 열번호]의 형태로 접근하며, 행열, 배열에서 사용했던 방법과 마찬가지로 생략을 통해 행만 출력, 열만 출력할 수 있다.
열 이름으로 접근 : 데이터프레임$열이름
데이터프레임에서 요소에 접근할때 열이름으로 접근하는 방법이있다. 이는 리스트에서 속성명으로 접근하는 방법과 매우 비슷하다. 데이터프레임명$열이름 의 형식으로 사용하며, 이렇게 사용하게 되면 해당 열에 있는 값이 벡터의 형태로 가로로 출력된다. 또한 출력된 열의 값(벡터)중에서도 원하는 하나의 요소를 가지고 오려면 데이터프레임명$열이름[인덱스번호]의 형태로 사용한다.
행이름으로 접근 : df['행이름',]
데이터프레임을 만든 후 rownames으로 행이름을 부여했다면 행이름으로 하나의 행만 추출할 수도 있다. 데이터프레임명['행이름',]의 방식으로 사용하는데, 행이름으로 접근할때는 오로지 해당 행이름에 해당하는 행의 값(한줄)만 출력하는 것이기때문에 컬럼 부분은 생략하여 반드시 ['행이름',]의 형태로 출력해주어야한다.
데이터프레임 수정
#데이터프레임 수정
#1)특정값 수정
print(stu_df$scores[1])
stu_df$scores[1] <- 70
stu_df[2,3] #6
stu_df[2,3] <- 8
print(stu_df[2,3])
#2)열추가 : 열에 들어갈 값을 벡터로 추가
#df$새로운 열이름 <- 벡터값
stu_df$gender <- c('남자','남자','남자','남자','여자')
print(stu_df)
#3)열 수정
stu_df$Age <- stu_df$Age+1
#Age열에 각각 +1
print(stu_df$Age)
stu_df$Age <- stu_df$Age-1
print(stu_df$Age)
#4)행추가 : 추가할 행의개수만큼 행이 들어가있는
#데이터프레임을 생성 후 추가(기존과 동일해야함!)
#rbind(df,추가할df)
#만약 추가할 행의 개수가 1개라면 리스트형태로 넣어도 됨
#추가할 행의 데이터프레임 생성
new_row <- data.frame(
ID=6,
name='짱아',
Age=2,
scores=70,
gender='여자'
)
print(new_row)
rownames(new_row) <- '6번' #행이름 생성
#데이터프레임 추가
stu_df <- rbind(stu_df,new_row)
print(stu_df)
특정갑 수정
특정값 수정방법은 인덱스로 개별요소에 접근 한 후 대입연산자를 사용하여 값을 수정하는 일반적인 방식이다.
열추가 : 열에 들어갈 값을 벡터로 추가
열추가는 벡터로 새로운 값을 만든다음에 데이터프레임$새로운컬럼명 <- 벡터(값) 의 형태로 열을 추가한다. 기존 데이터프레임에
없었던 gender컬럼이 생성된걸 확인할 수 있다.
열 수정
열을 수정하는 방법에는 여러방식이 있는데 앞서 학습한 내용처럼 개별값에 접근하여 값을 수정하는 방식도 있으며, 이처럼 열에 접근한다음에 열자체에 +1을 해주면 열에 있는 모든 값이 +1이 된다.
행추가
데이터프레임에서 열을 추가할때는 그냥 값을 생성한뒤 바로 넣어주면 됐는데, 행으로 값을 추가하는 방식은 약간 까다롭다. 먼저 기존데이터프레임과 똑같은 데이터프레임을 생성한후, 이를 합쳐주는 방식으로 행추가를 해야한다. 먼저 추가할 행의 데이터프레임을 생성하는데, 이때 컬럼명에 오타가 있거나하는등의 값이 약간이라도 차이가 있다면 절때 추가되지 않으니 이점을 주의해야한다.
그 후에 rbind를 이용하여 새롭게 생성한 데이터 프레임과 기존 데이터프레임을 합쳐주면 된다. rbind는 행열에서 행추가할때 사용하는 방식과 똑같이 사용하면된다.
데이터프레임의 조작함수
#데이터프레임의 조작함수
#1)subset() : 조건에따라 데이터프레임의 부분집합 반환
#subset(df,조건식)
print(stu_df)
#나이가 6살 이상인 아이들만 가져오기
print(subset(stu_df,Age>=6))
print(subset(stu_df,scores>=85))
subset_df1 <- subset(stu_df,Age>=6)
print(subset_df1)
subset_df2 <- subset(stu_df,scores>=85)
print(subset_df2)
#2)t(): 데이터 프레임의 행과 열 전치함수
print(t(stu_df))
print(stu_df) #원본변경은 안됨
t_df <- t(stu_df) #새로운 변수에 재할당
print(t_df)
#3)apply(데이터 프레임,1 or 2, 함수명): 데이터 프레임의 행이나 열에 함수적용
#각 행의 점수와 학생들의 나이 합계 계산
#행별 계산
row_sums <- apply(stu_df[c('Age','scores')],1,sum)
print(row_sums)
print(apply(stu_df[c('Age','scores')],1,median))
#열별 계산
col_sums <- apply(stu_df[c('Age','scores')],2,sum)
print(col_sums)
subset(df,조건식)
subset은 조건에 따라 데이터프레임의 부분집합을 반환한다. 사용법은 subset(데이터프레임명, 조건식)으로 적으며, 조건식에 해당하는 데이터프레임의 값만 추출하여 보여준다. 만약, 이렇게 추출된 데이터프레임을 새롭게 저장하고싶다면 변수에 할당해주면 된다.
t
t()는 전치함수로, 행과 열을 뒤바꿔주는 함수이다. 행렬에서 t함수가 쓰인적이 있는데 그와 동일하며, 마찬가지로 t로 전치한 데이터프레임은 원본변경이 되지 않기때문에 전치된 데이터프레임 값을 저장하고싶다면 새로운 변수에 할당해야한다.
apply
apply는 데이터프레임에서 행별,열별 계산할때 사용되는 함수이다. 행렬에서 사용하는 apply 함수와 사용법이 동일한데,
여러행이나 여러열을 한번에 계산할 수있다. 데이터프레임명안에 c함수로 묶어 열이름을 각각 전달하면 열별로 계산한 값을 반환한다.
데이터프레임활용 실습코드
#<실습>
#1) 다음의 데이터를 저장할 데이터 프레임 생성(person.df)
# name age gender height is_student
# 둘리 10 "M" 150 TRUE
# 또치 12 "F" 155 TRUE
# 도우너 11 "M" 145 TRUE
# 고길동 40 "M" 170 FALSE
person.df <- data.frame(
name=c('둘리','또치','도우너','고길동'),
age=c(10,12,11,40),
gender=c('M','F','M','M'),
height=c(150,155,145,170),
is_student=c(TRUE, TRUE, TRUE, FALSE)
)
print(person.df)
#2)위의 데이터 프레임에서 행 추가
#name: 마이콜 , age: 20, gender: 'M', height:180 ,is_student:FALSE
new_df <- data.frame(
name='마이콜',
age=20,
gender='M',
height=180,
is_student=FALSE
)
person.df <- rbind(person.df,new_df)
print(person.df)
#3)위의 데이터프레임에 행이름 삽입(1번,2번,,,..)
rownames(person.df) <- c('1번','2번','3번','4번','5번')
print(person.df)
#4)데이터 프레임에서 학생인 사람들의 평균 나이와 평균 키 출력
stu_T<- subset(person.df,is_student==TRUE)
print(stu_T)
apply(stu_T[c('age','height')],2,mean) #apply에서 이중 컬럼 선택시 무조건 벡터형태로 출력할것
#5)데이터 프레임에서 학생인 사람들의 나이 합계 출력
print(stu_T)
cat('학생인 사람들의 나이 합계 :' , apply(stu_T[2],2,sum),'살')
학습일기
오늘은 드디어 마지막 데이터구조인 데이터프레임에 대해 학습했다. 기분탓인가...유독 데이터구조들 중에 데이터프레임이 사용함수가 가장 많은것 같으면서도 그 사용함수들이 대부분 다른 데이터구조에서도 사용되는 함수이면서 사용법이 아주 약간씩 달라서 헷갈리는 부분들이 조금씩 있었다. 특히 subset이랑 apply부분이 조금 헷갈렸는데 subset부분에서는 함수안에 데이터프레임명 적어놓고 조건식에서 해당열부분을 열이름으로 값에 접근하는 방식으로 적는 실수가 많았고, apply부분에서는 c함수로 묶으면 동시에 여러 열의 계산을 볼 수 있다점을 계속 까먹고 따로따로 하나씩 계산한점....ㅎ
잘 못하는 부분들이 뭔지 알았으니 더 공부하라는 뜻이겠지...ㅎ🙄
'R분석' 카테고리의 다른 글
R복습_사용자 정의 함수(apply,sapply,함수 적용 활용) (0) | 2024.10.01 |
---|---|
R복습_제어문의 종류 조건문,반복문,기타 제어문(if, while, for,이중for, break,next) (0) | 2024.09.30 |
R복습_데이터구조 팩터(생성, 범주값, 인덱스, 슬라이싱, 함수,실습)+벡터 부록! (0) | 2024.09.27 |
R복습_데이터구조 리스트(생성, 인덱스, 슬라이싱, 함수, 결합) (0) | 2024.09.27 |
R복습_데이터구조 배열(생성, 인덱스, 슬라이싱, 함수, 연산) (0) | 2024.09.27 |