[ADsP]5.R 데이터 프레임 활용
😃
데이터 프레임의 데이터를 행/열 단위로 추출/제거/수정 함으로써 데이터 분석을 위한 데이터 클랜징 작업을 수행할 수 있다. 많은 경우 미리 데이터가 클랜징되어 들어오지만, 만약 R을 통해서 데이터를 수정해야 하는 경우 데이터 프레임을 사용하면 좋다.
데이터 프레임 생성
# 벡터를 통한 생성
> v1=c(1,2,3,4)
> v2=c("a","b","c","d")
> v3=c(T,F,F,T)
> data.frame(v1,v2,v3)
v1 v2 v3
1 1 a TRUE
2 2 b FALSE
3 3 c FALSE
4 4 d TRUE
# 행렬을 통한 생성
> m1 = matrix(c(1,3,5,7,9,2,4,6,8,19,2,3,5,7,11),ncol=3)
> as.data.frame(m1)
V1 V2 V3
1 1 2 2
2 3 4 3
3 5 6 5
4 7 8 7
5 9 19 11
# 벡터를 포함하는 리스트로 생성
> l1 = list(v1,v2,v3)
> as.data.frame(l1)
> l1 = list(v1,v2,v3)
> df1 = as.data.frame(l1)
> df1
c.1..2..3..4. c..a....b....c....d.. c.TRUE..FALSE..FALSE..TRUE.
1 1 a TRUE
2 2 b FALSE
3 3 c FALSE
4 4 d TRUE
# 데이터 프레임을 포함하는 리스트로 생성
> l1 = list(data.frame(id="a01",name="jelly"),
data.frame(id="a02",name="candy"),
data.frame(id="a3",name="coke"))
> do.call(rbind,l1)
id name
1 a01 jelly
2 a02 candy
3 a3 coke
# 여러 리스트로부터 생성
> l2 = list(list(id="a01",name="jelly"),
list(id="a02",name="candy"),
list(id="a3",name="coke"))
> df_list = lapply(l2,as.data.frame) # l2의 리스트 원소들에 대해 as.data.frame으로 변환
> do.call(rbind.df_list) # dataframe을 원소로 갖는 list를 rbind로 병합
# 칼럼 명 지정
> colnames(df1)=c("id","name","isTrue")
> df1
id name isTrue
1 1 a TRUE
2 2 b FALSE
3 3 c FALSE
4 4 d TRUE
# 레코드를 통한 생성 및 추가 (rbind)
> record = data.frame(id="a1234",name="paul",gender="M")
id name gender
1 a1234 paul M
> df1 = rbind(df1,record)
> df1
id name gender
1 a1111 annie F
2 a1234 paul M
# 열 추가 (cbind)
> col1 = data.frame(grade=c(3,2))
> df1 = cbind(df1,col1)
id name gender grade
1 a1111 annie F 3
2 a1234 paul M 2
# apply를 사용한 생성
데이터프레임 조회 (인덱싱)
# 테스트 데이터 생성
> us.state = data.frame(state.abb,state.name,state.region,state.area,stringsAsFactors=FALSE)
> us.state
state.abb state.name state.region state.area
1 AL Alabama South 51609
2 AK Alaska West 589757
3 AZ Arizona West 113909
4 AR Arkansas South 53104
# (생략)
# 데이터프레임 정보 표시
> str(us.state)
'data.frame': 50 obs. of 4 variables:
$ state.abb : chr "AL" "AK" "AZ" "AR" ...
$ state.name : chr "Alabama" "Alaska" "Arizona" "Arkansas" ...
$ state.region: Factor w/ 4 levels "Northeast","South",..: 2 4 4 2 4 4 1 2 2 2 ...
$ state.area : num 51609 589757 113909 53104 158693 ...
# 특정 열 조회
> us.state[2]
state.name
1 Alabama
2 Alaska
3 Arizona
4 Arkansas
# (생략)
> us.state[c(2,4)]
state.name
1 Alabama
2 Alaska
3 Arizona
4 Arkansas
> us.state[,2,drop=FALSE] #drop을 설정하면 list 형태로 출력된다.
state.name
1 Alabama
2 Alaska
3 Arizona
4 Arkansas
# 특정 행에 대한 정보 조회
> us.state[5,c(2,4)]
state.name state.area
5 California 158693
> us.state[state.name]
> us.state["state.name"]
state.name
1 Alabama
2 Alaska
3 Arizona
4 Arkansas
5 California
# (생략)
#조건을 통한 조회
> us.state[us.state$state.area>5000 , c("state.name", "state.area")]
state.name state.area
1 Alabama 51609
2 Alaska 589757
3 Arizona 113909
4 Arkansas 53104
5 California 158693
# 복수 조건을 통한 조회
> us.state[us.state$state.area>5000 & us.state$state.region == "West", c("state.name", "state.area","state.region")]
state.name state.area state.region
2 Alaska 589757 West
3 Arizona 113909 West
5 California 158693 West
6 Colorado 104247 West
# subset 을 이용한 조회
subset(us.state, select=c("state.name","state.area", "state.region"), subset=us.state$state.area>5000 & us.state$state.region == "West")
# with 절 사용(아래 결과는 동일)
> iris$Sepal.Length/iris$Sepal.Width
> with(iris, Sepal.Length / Sepal.Width)
# 여러 연산을 한번에 수행 {} 안에는 local namespace 사용
> with(iris, {
+ print(summary(Sepal.Length / Sepal.Width))
+ plot(Sepal.Length/Sepal.Width)
+ r1 <- Sepal.Length / Sepal.Width
+ r2 <<- Sepal.Length / Sepal.Width # 외부에서 접근 가능
+ })
# within 사용
> head( within(iris, Sepal.ratio <- Sepal.Length / Sepal.Width) )
Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.ratio
1 5.1 3.5 1.4 0.2 setosa 1.457143
2 4.9 3.0 1.4 0.2 setosa 1.633333
3 4.7 3.2 1.3 0.2 setosa 1.468750
4 4.6 3.1 1.5 0.2 setosa 1.483871
5 5.0 3.6 1.4 0.2 setosa 1.388889
6 5.4 3.9 1.7 0.4 setosa 1.384615
그 외 연산
# 메모리로 데이터 프레임 attache/detach (복제본이 적재됨)
> attach(iris)
> search()
> detache(iris)
# 데이터 프레임 병합
> merge(df1, df2, by=region, all=T)
# 열 제거
subset(us.state, select=-Area)
# 데이터 구조 변경
> as.data.frame()
> as.list()
> as.matrix()
> as.vector()
R 언어에 대해서 전반적인 내용을 모두 보려고 하니 내용이 너무 많다. 다행인 것은 유투브에 좋은 강의들이 많이 있다는 것이다. 시간이 허락된다면 유투브의 강의를 듣는 것이 큰 도움이 될 것으로 생각된다.