본문 바로가기
  • Let's go grab a data
Data/R

[R 기초] 배열, 행렬, 요인, 데이터프레임, 리스트, 함수적용

by pub-lican-ai 2016. 3. 6.
반응형

[R 기초] 배열, 행렬, 요인, 데이터프레임, 리스트, 함수적용

#array #matrix #cbind #rbind #apply #factor #tapply #data.frame #with #subset #na.omit #list #lapply #sapply


배열 Array 생성하기 array() 같은타입의 벡터 모임

array(data = NA, dim= length(data), dimnames = NULL)

dim : 차원 생성

dimnames : 차원별 이름

예시)

> arrname = list(c("row1","row2"),c("col1","col2","col3","col4"))

> arr<-array(1:3, c(2,4),dimnames = arrname)

> arr

     col1 col2 col3 col4

row1    1    3    2    1

row2    2    1    3    2

> arr[1,]

col1 col2 col3 col4 

   1    3    2    1 

> arr["row1",]

col1 col2 col3 col4 

   1    3    2    1 


행렬 Matrix 생성하기 matrix() 2차원배열

matrix(data = NA, nrow = 1, ncol =1, byrow = F, dimnames = NULL)

nrow : 행 요소의 개수

ncol : 열 요소의 개수

byrow : 데이터를 행 단위로 배치할 지 여부

dimnames : 행과 열의 이름 list

예시)

> temp<- 1:12

> temp

 [1]  1  2  3  4  5  6  7  8  9 10 11 12

> m <-matrix(temp,nrow = 3)

> m

#nrow =3 과 ncol=4는 동일한 결과

     [,1] [,2] [,3] [,4]

[1,]    1    4    7   10

[2,]    2    5    8   11

[3,]    3    6    9   12

> m1 <-matrix(temp,nrow =3, byrow=T)

#row부터 채워나간다 기본은 F col부터 채워나감

> m1

     [,1] [,2] [,3] [,4]

[1,]    1    2    3    4

[2,]    5    6    7    8

[3,]    9   10   11   12


행렬 합치기 cbind(), rbind()

> v1<-1:4

> v2<-5:8

> v3<-9:12

> cbind(v1,v2,v3)

#열별 각 벡터 채움

     v1 v2 v3

[1,]  1  5  9

[2,]  2  6 10

[3,]  3  7 11

[4,]  4  8 12

> rbind(v1,v2,v3)

#행별 각 벡터 채움

   [,1] [,2] [,3] [,4]

v1    1    2    3    4

v2    5    6    7    8

v3    9   10   11   12


함수적용 apply() 행렬 자료에 대해 함수 적용

apply(X, MARGIN, FUN, ...)

X : 적용할 배열 또는 행렬

MARGIN : 함수를 적용할 차원, 행렬의 경우 1이면 행별, 2이면 열별로 적용

FUN : 적용할 함수

예시)

> v1<-1:4

> v2<-5:8

> v3<-9:12

> m2<-cbind(v1,v2,v3)

> apply(m2,1,sum)

[1] 15 18 21 24

> apply(m2,2,sum)

v1 v2 v3 

10 26 42 

> apply(m2,1,mean)

[1] 5 6 7 8

> apply(m2,2,mean)

  v1   v2   v3 

 2.5  6.5 10.5 


요인 Factor 범주형 자료 factor()

factor(X=character(), levels, labels=levels, exclude=NA, ordered=is.ordered(x), nmax=NA)

X : 요인으로 만들 벡터

levels : 주어진 데이터 중 요인으로 할 데이터 지정

labels : 요인 이름

exclude : 요인으로 사용하지 않을 값 지정

ordered : 순서여부 (T/F) 순서있는 범주의 경우 사용

nmax : 최대 level의 수 (즉, 최대 요인수)

예시)

> x<-1:5

> x

[1] 1 2 3 4 5

> factor(x,levels=c(1,2,3,4))

[1] 1    2    3    4    <NA>

Levels: 1 2 3 4

> factor(x,levels=c(1,2,3,4), exclude=c(1,2))

[1] <NA> <NA> 3    4    <NA>

Levels: 3 4

> factor(x,levels=c(1,2,3,4),ordered = T)

[1] 1    2    3    4    <NA>

Levels: 1 < 2 < 3 < 4

> factor(x)

[1] 1 2 3 4 5

Levels: 1 2 3 4 5


함수적용 tapply() table형태의 자료에 대해 함수 적용

tapply(X, INDEX, FUN=NULL, ... simplify=T)

X: 집계할 자료 벡터

INDEX : X를 집계할 요인이나 요인의 리스트

FUN : 집계에 사용할 함수

simplify : 결과 형태 (T/F) T:스칼라로 F:리스트형의 배열로 반환

예시) 

> score<-c(92,90,82,88,78,64,82,90)

> subject<-c("k","k","m","m","m","k","k","m")

> s.f<-factor(subject,levels=c("k","m"))

> tapply(score,s.f,mean)

   k    m 

82.0 84.5


데이터프레임 data.frame() 다양한 형태의 벡터들의 집합, 집합내는 동일 벡터, 집합별 길이가 같아야 함

예시)

> name <- c("A","B","C")

> age <- c(10,20,30)

> gender<-factor(c("M","F","M"))

> students <-data.frame(name,age,gender)

> students

  name age gender

1    A  10      M

2    B  20      F

3    C  30      M

> students1 <-data.frame(names=name,ages=age,genders=gender)

> students1

  names ages genders

1     A   10       M

2     B   20       F

3     C   30       M

> students$age

[1] 10 20 30

> students["age"]

  age

1  10

2  20

3  30

> students[,2]

[1] 10 20 30

> students[1,]

  name age gender

1    A  10      M

> str(students)

'data.frame': 3 obs. of  3 variables:

 $ name  : Factor w/ 3 levels "A","B","C": 1 2 3

 $ age   : num  10 20 30

 $ gender: Factor w/ 2 levels "F","M": 2 1 2


attach() & detach() 데이터 프레임 내 항목들에 변수처럼 쉽게 접근, $를 제거해줌

> head(airquality)

  Ozone Solar.R Wind Temp Month Day

1    41     190  7.4   67     5   1

2    36     118  8.0   72     5   2

3    12     149 12.6   74     5   3

4    18     313 11.5   62     5   4

5    NA      NA 14.3   56     5   5

6    28      NA 14.9   66     5   6

> airquality[sample(50,4),]

   Ozone Solar.R Wind Temp Month Day

12    16     256  9.7   69     5  12

2     36     118  8.0   72     5   2

9      8      19 20.1   61     5   9

24    32      92 12.0   61     5  24

> airquality$Ozone

  [1]  41  36  12  18  NA  28  23  19   8  NA   7  16  11  14  18  14  34

 [18]   6  30  11   1  11   4  32  NA  NA  NA  23  45 115  37  NA  NA  NA

 [35]  NA  NA  NA  29  NA  71  39  NA  NA  23  NA  NA  21  37  20  12  13

 [52]  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 135  49  32  NA  64  40  77

 [69]  97  97  85  NA  10  27  NA   7  48  35  61  79  63  16  NA  NA  80

 [86] 108  20  52  82  50  64  59  39   9  16  78  35  66 122  89 110  NA

[103]  NA  44  28  65  NA  22  59  23  31  44  21   9  NA  45 168  73  NA

[120]  76 118  84  85  96  78  73  91  47  32  20  23  21  24  44  21  28

[137]   9  13  46  18  13  24  16  13  23  36   7  14  30  NA  14  18  20

> attach(airquality)

> Ozone

  [1]  41  36  12  18  NA  28  23  19   8  NA   7  16  11  14  18  14  34

 [18]   6  30  11   1  11   4  32  NA  NA  NA  23  45 115  37  NA  NA  NA

 [35]  NA  NA  NA  29  NA  71  39  NA  NA  23  NA  NA  21  37  20  12  13

 [52]  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 135  49  32  NA  64  40  77

 [69]  97  97  85  NA  10  27  NA   7  48  35  61  79  63  16  NA  NA  80

 [86] 108  20  52  82  50  64  59  39   9  16  78  35  66 122  89 110  NA

[103]  NA  44  28  65  NA  22  59  23  31  44  21   9  NA  45 168  73  NA

[120]  76 118  84  85  96  78  73  91  47  32  20  23  21  24  44  21  28

[137]   9  13  46  18  13  24  16  13  23  36   7  14  30  NA  14  18  20

> detach(airquality)

> Ozone

Error: object 'Ozone' not found


함수적용 with() 데이터 프레임내 항목들에 함수 또는 수식 적용

with(data,expr,...)

data : 데이터프레임 또는 리스트

expr : 수행할 함수 또는 수식 등의 표현

예시) 

> head(cars)

  speed dist

1     4    2

2     4   10

3     7    4

4     7   22

5     8   16

6     9   10

> cars$speed

 [1]  4  4  7  7  8  9 10 10 10 11 11 12 12 12 12 13 13 13 13 14 14 14 14

[24] 15 15 15 16 16 17 17 17 18 18 18 18 19 19 19 20 20 20 20 20 22 23 24

[47] 24 24 24 25

> mean(cars$speed)

[1] 15.4

> with(cars,mean(speed))

[1] 15.4

> with(cars,plot(speed,dist))

# plot(cars$speed, cars$dist) 과 같음


부분집합 추출 subset() 

subset(X,subset,select,drop=F,...)

x : 데이터프레임

subset : 부분집합을 생성할 조건

select : 변환할 열 조건식

drop : '['로 전달될 슬라이싱 조건

예시)

> head(airquality)

  Ozone Solar.R Wind Temp Month Day

1    41     190  7.4   67     5   1

2    36     118  8.0   72     5   2

3    12     149 12.6   74     5   3

4    18     313 11.5   62     5   4

5    NA      NA 14.3   56     5   5

6    28      NA 14.9   66     5   6

> subset(airquality,Temp>93)

    Ozone Solar.R Wind Temp Month Day

120    76     203  9.7   97     8  28

121   118     225  2.3   94     8  29

122    84     237  6.3   96     8  30

123    85     188  6.3   94     8  31

> subset(airquality,Temp>93,select = c(Ozone,Temp))

    Ozone Temp

120    76   97

121   118   94

122    84   96

123    85   94

> subset(airquality,Temp>93,select = -c(Ozone,Temp))

    Solar.R Wind Month Day

120     203  9.7     8  28

121     225  2.3     8  29

122     237  6.3     8  30

123     188  6.3     8  31


na.omit NA 데이터 제거

예시) 

> str(airquality)

'data.frame': 153 obs. of  6 variables:

 $ Ozone  : int  41 36 12 18 NA 28 23 19 8 NA ...

 $ Solar.R: int  190 118 149 313 NA NA 299 99 19 194 ...

 $ Wind   : num  7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...

 $ Temp   : int  67 72 74 62 56 66 65 59 61 69 ...

 $ Month  : int  5 5 5 5 5 5 5 5 5 5 ...

 $ Day    : int  1 2 3 4 5 6 7 8 9 10 ...

> no<-na.omit(airquality)

> str(no)

'data.frame': 111 obs. of  6 variables:

 $ Ozone  : int  41 36 12 18 23 19 8 16 11 14 ...

 $ Solar.R: int  190 118 149 313 299 99 19 256 290 274 ...

 $ Wind   : num  7.4 8 12.6 11.5 8.6 13.8 20.1 9.7 9.2 10.9 ...

 $ Temp   : int  67 72 74 62 65 59 61 69 66 68 ...

 $ Month  : int  5 5 5 5 5 5 5 5 5 5 ...

 $ Day    : int  1 2 3 4 7 8 9 12 13 14 ...

 - attr(*, "na.action")=Class 'omit'  Named int [1:42] 5 6 10 11 25 26 27 32 33 34 ...

  .. ..- attr(*, "names")= chr [1:42] "5" "6" "10" "11" ... 


리스트 list() 다양한 자료구조의 벡터를 가질수 있음, 데이터의 순서가 있음(인덱스), 데이터 집합별 길이가 다를 수 있음

> title <- "My List"

> ages <- c(31,43,41)

> numbers <-matrix(1:9, ncol = 3)

> names<- c("Baby","gentle","none")

> listEx<-list(title,ages,numbers,names)

> listEx

[[1]]

[1] "My List"


[[2]]

[1] 31 43 41


[[3]]

     [,1] [,2] [,3]

[1,]    1    4    7

[2,]    2    5    8

[3,]    3    6    9


[[4]]

[1] "Baby"   "gentle" "none"  


> str(listEx)

List of 4

 $ : chr "My List"

 $ : num [1:3] 31 43 41

 $ : int [1:3, 1:3] 1 2 3 4 5 6 7 8 9

 $ : chr [1:3] "Baby" "gentle" "none"


> listEx[[1]]

[1] "My List"


> listEx2 <-list(title=title,age=ages,number=numbers,name=names)

#데이터를 넣을때 각 데이터 집합별로 변수를 만들어주자

> str(listEx2)

List of 4

 $ title : chr "My List"

 $ age   : num [1:3] 31 43 41

 $ number: int [1:3, 1:3] 1 2 3 4 5 6 7 8 9

 $ name  : chr [1:3] "Baby" "gentle" "none"

> listEx2$title

#dataframe처럼 변수에 접근이 쉽다

[1] "My List"


lapply(X,FUN,...)

X: 적용할 리스트

FUN: 적용할 함수

예시)

> x<-list(a=1:10, beta=exp(-3:3),logic=(c(T,F,F,T)))

> str(x)

List of 3

 $ a    : int [1:10] 1 2 3 4 5 6 7 8 9 10

 $ beta : num [1:7] 0.0498 0.1353 0.3679 1 2.7183 ...

 $ logic: logi [1:4] TRUE FALSE FALSE TRUE

> lapply(x,mean)

#각 변수별로 함수를 전달하고 list로 반환

$a

[1] 5.5


$beta

[1] 4.535125


$logic

[1] 0.5


> sapply(x,mean)

#각 변수별로 함수를 전달하고 벡터로 반환

       a     beta    logic 

5.500000 4.535125 0.500000 

> str(sapply(x,mean))

 Named num [1:3] 5.5 4.54 0.5

 - attr(*, "names")= chr [1:3] "a" "beta" "logic"



반응형