반응형

Matrix and Array


vector에 "dim" attributes를 추가하면 다차원 배열이 된다.


생성은 array, matrix 또는 dim을 이용한다.


> a <- matrix(1:6, ncol = 3, nrow = 2)

> a

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

[1,]    1    3    5

[2,]    2    4    6



> b <- array(1:12, c(2,3,2))

> b

, , 1


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

[1,]    1    3    5

[2,]    2    4    6


, , 2


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

[1,]    7    9   11

[2,]    8   10   12


> c <- 1:6

> dim(c) <- c(3,2)

> c

     [,1] [,2]

[1,]    1    4

[2,]    2    5

[3,]    3    6


> d <- array(1:12, dim = c(2,3,2))

> d

, , 1


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

[1,]    1    3    5

[2,]    2    4    6


, , 2


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

[1,]    7    9   11

[2,]    8   10   12



Data frame


> df <- data.frame(x = 1:3, y = c("a","b","c"), z = 10:12)

> df

  x y  z

1 1 a 10

2 2 b 11

3 3 c 12


> str(df)

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

 $ x: int  1 2 3

 $ y: Factor w/ 3 levels "a","b","c": 1 2 3

 $ z: int  10 11 12


> class(df)

[1] "data.frame"



Data frame에서 벡터를 factor로 변경하지 않기 위해서는 아래와 같이

stringsAsFactors = FALSE를 해준다.


참고로 str(df)를 하면 y, z 모두 factor이 아닌걸 보면 stringsAsFactors는 어느 위치에 있어도 무방하다는 것을 알 수 있다.


> df <- data.frame(

+     x = 1.3,

+     y = c("a","b","c"),

+     stringsAsFactors = FALSE,

+     z = c("d","e","f")

+ )

> df

    x y z

1 1.3 a d

2 1.3 b e

3 1.3 c f


> str(df)

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

 $ x: num  1.3 1.3 1.3

 $ y: chr  "a" "b" "c"

 $ z: chr  "d" "e" "f"




Data frame에서 cbind와 rbind는 아래와 같이 한다.

데이터프레임에서는 항상 <-가 아닌 =로 식을 대입한다.


> df <- data.frame(

+     x = 1:3,

+     y = c("a","b","c"),

+     stringsAsFactors = FALSE

+ )

> df

  x y

1 1 a

2 2 b

3 3 c


> a <- cbind(df, data.frame(z = 3:1))

> a

  x y z

1 1 a 3

2 2 b 2

3 3 c 1


> b <- rbind(df, data.frame(x = 4, y = "d"))

> b

  x y

1 1 a

2 2 b

3 3 c

4 4 d


Data frame에 list를 담기 위해서는 $표시 혹은 I()를 이용하여 담아준다.


> df <- data.frame(x = 1:3)

> df$y <- list(1:2, 1:3, 1:4)

> df

  x          y

1 1       1, 2

2 2    1, 2, 3

3 3 1, 2, 3, 4


> data.frame(x = 1:3, y = list(1:2, 1:3, 1:4))

Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : 

  arguments imply differing number of rows: 2, 3, 4


> df1 <- data.frame(x = 1:3, y = I(list(1:2, 1:3, 1:4)))

> df1

  x          y

1 1       1, 2

2 2    1, 2, 3

3 3 1, 2, 3, 4


> df1[2,"y"]

[[1]]

[1] 1 2 3







반응형