[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 언어에 대해서 전반적인 내용을 모두 보려고 하니 내용이 너무 많다. 다행인 것은 유투브에 좋은 강의들이 많이 있다는 것이다. 시간이 허락된다면 유투브의 강의를 듣는 것이 큰 도움이 될 것으로 생각된다.