자료형(integer,character) 변환 및 데이터 구조(dataFrame, list) 변환



자료형


각각의 자료형들간의 변환은 아래의 함수들을 이용 한다.

as.character(x)

as.complex(x)

as.numeric(x) or as.double(x)

as.integer(x)

as.logical(x)





R에서는 데이터 분석을 위한 유용한 데이터 구조를 기본으로 제공해 준다.

데이터 구조(5개): vector, list, data frame, matrix(array), factor 


모드: 

R에서 해당 객체를 메모리에 어떻게 저장할 것인가를 가리키는 것이 "모드"이다

숫자로 저장할 것인가?

문자열 ?

다른 객체로의 포인터로된 리스트들?

함수?

위의 다양한 것들로서 메모리에 저장 될 수 있다.


객체, 예, 모드

숫자, 3.21415, 수치형

숫자백터, c(2, 3), 수치형

문자열, "More", 문자형

문자열 백터, c("More","Larry","Curly"), 문자형

요인, factors(c("NY","CA","IL")),수치형

리스트, list("More","Larry","Curly"), 리스트

데이터 프레임, data.frame(x=1:3, y=c("NY","CA","IL")), 리스트

함수, print, 함수


알아내느 방법

mode()



Class: 추상적인 자료형


R에서는 모든 객체는 추상 자료형인 '클래스'도 가지고 있다.

거리, 시간, 무게 모두 어떤 숫자이므로 모드는 숫자(numeric)이다.

하지만 각각의 해석 방법이 다르므로 클래스는 상이할 수 있다.


결국 클래스가 R에서 직접적인 데이터 처리 방식을 결정하게 된다.


예를들면 print()라는 함수는 입력된 데이터의 class에 따라서 그 처리를 다르게 하는 것이다.

위에서 설명한 모드는 메모리에 저장되는 형태지, 논리적으로 프로그래밍 할 때 쓰는 단위는 아니다.





Factor (범주형 자료)



생성 방법

factor(

x, #팩터로 표현하고자 하는 값(주로 문자열 벡터로 지정)

levels, #값의 레벨

ordered #TRUE면 순서형, FALSE면 명목형 데이터를 뜻한다. 기본값은 FALSE다.

)


팩터에서 레벨의 개수를 반환함.

nlevels(

x # 팩터 값

)


중간에 값 넣기

factor(append(as.character(proximity),"TRUE"))


factor level rename

http://www.cookbook-r.com/Manipulating_data/Renaming_levels_of_a_factor/



Vectors


백터는 동질적이다.

같은 자료형을 가진다.

같은 모드를 가지고 있어야 한다.


스칼라와 백터의 관계는 통상 엄밀히 구분하지만 R에서는 딱히 구분하지 않는다.

하나의 값으로 구성된 백터가 스칼라고

여러개 있으면 백터라고 생각하면 된다.




List


이질적이다.

다양한 자료형을 포함 할수 있다.


생성방법

list <- list(x,y,z) #이질적인 데이터도 가능함.

list <- list(mid=0.5, right=0.841, far=0.9)



접근방법

리스트 변수[[인덱스] # 값을 접근함

리스트 변수[인덱스] # (키,값) 의 형태로 서브 리스트를 반환 한다.


제거방법

x[-2] # without 2nd element

x[-c(2,3)] # without 2nd and 3rd

x["arrival_time"] <- NULL


빈리스트를 생성하고 인덱스를 이름으로 지정하는 방법

vecNames <- list.files("./ESLABCollector/")
filenames <- sapply(vecNames,list)  

Foreach를 사용할 때 list 인덱스의 이름을 유지하는 방법

jsonDfList <- foreach (x = rawDataList, .final = function(x) setNames(x, names(filenames))) %do% {

    jsonTodf(x)

}


.final 을 이용한다.

결국 setNames란 아래의 것을 축약한 기능이다.

setNames( 1:3, c("foo", "bar", "baz") )

# this is just a short form of

tmp <- 1:3

names(tmp) <-  c("foo", "bar", "baz")

tmp



List 중간에 값을 삽입 하기


append(testList, list(x=42), 3)

$`1`

[1] 1

$`2`

[1] 2

$`3`

[1] 3

$x

[1] 42

$`4`

[1] 4


append(lst, list(f=1:5), after=0)# after - position to append

Helper 함수를 생성하는 방법

lappend <- function (lst, ...){
lst <- c(lst, list(...))
  return(lst)
}

> a <- list()
> a
list()

> lappend(a,c(1,2,3))
[[1]]
[1] 1 2 3

> lappend(a, c(4,5,6), c(7,8,9))
[[1]]
[1] 4 5 6

[[2]]
[1] 7 8 9




Matrix


백터에 차원을 정해주면 바로 Matrix로 변경 된다.


백터의 dim 속성이 처음엔 NULL 이지만 이것을 주게 되면 matrix가 된다.

dim(2,3) # 2 by 3 행렬


list도 dim 변경을해서 행렬화 할 수 있다.

하지만 list의 특성상 이질적인 행렬을 만들어 낼 수 있으므로 그러한 것들은 조심해야 한다.




Array (배열)


3차원 matrix 부터는 배열이라는 이름을 쓴다.


Factor(요인)

백터처럼 생겼지만 특별한 속성이 있다.

R은 백터에 있는 고유한 값(unique value)의 정보를 얻어 내는데, 이 고유 값들을 요인의 '수준(level)'이라고 일컫는다.

요인들은 간단하고 효율적인 형태로 데이터 프레임에 저장된다.

다른 프로그래밍 언어에서는 요인을 '열거형 값(enumerated value)들로 이루어진 백터로 표현한다.


요인의 사용처는 아래와 같다.


범주형 변수>

요인 하나는 범주형 변수 하나를 나타낼 수 있다. 

범주형 변수들은 분할표, 선형 회귀, 변량 분석, 로지스틱 회귀 분석 등 많은 분야에서 사용 된다.


집단 분류

이것은 데이터 항목에다가 집다에 따른 라벨을 붙이거나 태깅을 할 때 쓰는 방법이다.




데이터 프레임 (Data Frame)


가장 중요한 데이터 타입이다.

표 형태의 데이터를 표현하기 위함이다.


특징

행은 모두 같은 길이이다. 열은 하나의 엘리먼트를 나타낸다.

행렬과 다른점은 각각의 행들이 서로다른 데이터 타입들을 가질 수 있다는 것이다.

즉, 각각의 열들은 같은 타입으로 이뤄지지만, 모든 열이 모두 같을 필요는 없다.

데이터 프레임의 속성은 row.names()를 통해서 알 수 있다.

통상 read.table() 또는 read.csv()를 통해서 생성 한다.

행렬을 data frame으로 변경 할 수 있다. data.matrix() 호출을 통해서



▣ 데이터 프레임 생성하기

data.frame()을 사용


g <- c("A","B")

x <- 1:3

dat <- data.frame(g,x)


▣ 리스트를 프레임 데이터로 변경

frame.data(list)



▣ 프레임의 구조를 알려준다.

str(data)

> str(ac)

'data.frame': 356 obs. of  2 variables:

 $ Time : num  0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 ...

 $ Power: num  14.8 14.1 19.9 14.6 14.1 ...



▣ 프레임에서 열들만 따로 출력하는 방법이다.

data$time



▣ 데이터 프레임의 Index를 알아내는 방법

> a <- data.frame(1:6,11:16)

> a

  X1.6 X11.16

1    1     11

2    2     12

3    3     13

4    4     14

5    5     15

6    6     16

> grep(15,a[,2])

[1] 5


▣ 해당 컬럼 이름이 몇번째 인지를 알아내는 방법

> grep("X11.16",colnames(a))

[1] 2



▣ 프레임에서 행과 열만 따로 출력하는 방법이다.

data$time[0]



▣ 위치로 데이터 프레임의 열 선택하기


스타일에 따라 또는 데이터프레임 두가지 자료형중 하나로 반환 된다.


데이터 프레임 스타일의 선택 방법

dfm[[n]] # 하나의 열을 반환 한다.

dfm[n] # n번째 열 단독으로만 구성된 '데이터 프레임'을 반환 한다.

dfm[c(n1,n2,...,nk)] # n1,n2,....,nk 위치에 있는 열들로 만든 "데이터 프레임"을 반환한다.


행렬 방식의 첨자 지정을 이용해서 선택 하는 방법

dfm[,n] # n번째 을 반환 한다

dfm[,c(n1,n2,...,nk)] # n1,n2,...,nk 위치에 있는 열들로 만든 "데이터 프레임"을 반환 한다.



▣ 프레임 열의 이름을 변경하는 방법이다.

names(data) <- c("name1", "name2", "name3")

 


▣ 특정 열을 찾아서 이름을 변경하는 방법

> names(ac)[names(ac)=="Time"] <- c("newTime")

> names(ac)

[1] "newTime" "Power"  

> names(ac)[names(ac)=="newTime"] <- c("Time")

> names(ac)

[1] "Time"  "Power"



▣ 데이터 프레임에 열 추가하기

새로운 열의 이름을 설정하고 "NA"로 채운다.

data$newcol <- NA


새로운 열의 이름을 설정하고 백터를 삽입한다.

data$newcol <- vec



▣ 데이터 프레임에 열을 제거하기

해당열에 NULL을 대입한다.


data$badcol <- NULL

subset(data, select = -badcol)

subset(data, select = c(-badcol, -othercol)



▣ 데이터 프레임 열 순서 변경하기

#숫자로 해당열을 선택해서 변경한다.

dat <- dat[c(1,3,2)]


#이름으로 선택해서 변경 한다.

data <- dat[c("col1","col3","col2")]



▣ 데이터 프레임의 부분 집합 취하기

subset() 함수를 이용해서 부분 집합을 취할 수 있다.


일련의 조건을 기입하고 그 조건에 맞는 행등을 추출 할 수 있다.


subset(climate, Source == "Berkeley", select = c(Year, Anomaly10y))

# 데이터 셋 climate에서

# Source 열이 "Berkeley인 것에 대해서

# Year 와 Anomaly10y의 열에 대해서만 그 값을 추출 


논리 연산자를 조합하면 일정 범위 내의 데이터를 추출 할 수도 있다.


1900년에서 2000년 사이의 source가 "Berkeley"인 행들만 선택 한다.

subset(climate, Source == "Berkeley" & Year >= 1900 & Year <= 2000, select = c(Year, Anomaly10y))



▣ 여러가지 방법을 이용한 데이터 프레임 합치기


데이터 프레임 합치기

cbind # 두개의 데이터를 열로 쌓는다.

rbind # 두개의 데이터를 행으로 쌓는다.


연속적인 리스트라면,

do.call(rbind,mylist)를 하면된다.


주의: 위방법들은 모두 행열이 같은 크기일때만 가능함

크기가 서로 다르면 반복해서 아랫부분을 채워준다고 하지만 이상하게 동작하지 않는다.


서로다른 데이터 프레임 합치기

merge # SQL에서 join에 해당하는 명령어이다

default로 동작은 그냥 다순히 합치는 것이다.

일치하지 않는것이 있다면 데이터의양이 NxM의 양으로 늘어 난다.


일치하는 부분만 합치고 싶으면,

merge(A,B, by="열 이름") 

으로 설정한다.


merge의 다른 option들

## S3 method for class 'data.frame'
merge (x, y, by = intersect(names(x), names(y)),
      by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
      sort = TRUE, suffixes = c(".x",".y"),
      incomparables = NULL, ...)

x, y

data frames, or objects to be coerced to one.

by, by.x, by.y

해당 기준으로 합친다. 없는것는들은 제거한다.

즉, 가장 짧은 기준으로 합친다.

5, 10 이라면 5만큼 길이가 설정됨.

all

logical; all = L is shorthand for all.x = L and all.y = L, where L is either TRUE or FALSE.

all.x

logical; if TRUE, then extra rows will be added to the output, one for each row in x that has no matching row in y. These rows will have NAs in those columns that are usually filled with values from y. The default is FALSE, so that only rows with data from both x and y are included in the output.

all.y

logical; analogous to all.x.

sort

logical. Should the result be sorted on the by columns?

suffixes

a character vector of length 2 specifying the suffixes to be used for making unique the names of columns in the result which not used for merging (appearing in by etc).

incomparables

values which cannot be matched. See match. This is intended to be used for merging on one column, so these are incomparable values of that column.


서로다른 크기의 데이터 프레임 합치기

일치하지 않는 컬럼을 단순히 <NA>로 채우고 싶다면,

plyr package의 rbind.fill을 사용하면 된다.



향상된 데이터 프레임 합치기

reshape2 package

본인 정리

Reshape and aggregate data with the R package reshape2


plyr package

본인정리


데이터 프레임 행과 열 크기 알아내기

nrow()

ncol()


help(package = "reshape2")

원본 참고 사이트: http://seananderson.ca/2013/10/19/reshape.html

reshape 2 website: http://had.co.nz/reshape/



서로 다른 데이터 타입들간의 데이터 상호 변환




변환 

방법 

주석 

 벡터 -> 리스트

as.list(vec) 

 

 벡터 -> 행렬

cbind(), as.matrix()

rbind(), matrix(vec,n,m) # n by m 행렬 

생성 

 

 벡터 ->데이터 프레임

#열 한 개짜리 데이터 프레임

as.data.frame(vec)

# 행 한 개짜리 데이터 프레임

as.data.frame(rbind(vec))

 

 리스트 -> 벡터

unlist(list)

as.vector 대신에 unlist가 좋다. 

 리스트 -> 행렬 

열 한 개짜리 행렬: as.matrix(list)

행 한 개짜리 행렬: as.matrix(rbind(list))

n by m 행렬: matrix(list,n,m) 

 

 리스트 -> 데이터 프레임

목록 원소들이 데이터의 열이면:

as.data.frame(list)

 

 

 행렬 -> 벡터

 as.vector(mat) 

 행렬의 모든 원소들을 벡터로 반환 한다. 

 행렬 -> 리스트

 as.list(mat)

 행렬의 모든 원소들을 리스트로 변환 한다.

 행렬 -> 데이터 프레임

 as.data.frame(mat) 

  

 데이터 프레임 -> 벡터

 dfm[1,]#행 하나 짜리 데이터 프레임 변환

 dfm[,1] or dfm[[1]] #열 하나짜리 데이터 프레임 변환

 

 데이터 프레임 -> 리스트

 as.list(dfm)

 

 데이터 프레임 -> 행렬

 as.matrix(dfm)

 






'AI > R Basic' 카테고리의 다른 글

R 기본 디버깅 (Debugging) 및 RStudio 이용  (0) 2015.10.04
R Studio 설치법 및 사용 Tip  (0) 2015.10.04
Apply 함수 (데이터 조작)  (1) 2015.10.03
R의 문자열 처리 및 비교  (0) 2015.10.03
Plyr package (데이터 조작)  (0) 2015.10.01

+ Recent posts