본문 바로가기

데이터분석/R

[R 기초]vector, list의 슬라이싱, 원소 추가, 수정, 제거 등 in r

1. 벡터 c()

2. 리스트 list()

3. 1차원 자료의 슬라이싱(slicing)

4. 2차원 자료의 슬라이싱

5. 원소 추가(삽입)

6. 원소 수정(변경)+전처리

7. 원소 제거(삭제)


 

1. 벡터 c()

 

c()에 원소들을 넣어 벡터를 만들 수 있습니다. 벡터의 원소로 문자열, 숫자, 변수, 논리값 등이 가능하지만 각 원소의 형태들이 같아야 합니다.

> num <- c("one", "two", "three")
> cat("벡터의 길이:", length(num))
벡터의 길이: 3

 

벡터의 원소가 모두 문자열 형태인 경우 class는 문자열, 원소가 모두 숫자인 경우 숫자로 인식합니다. 그러나 여러가지 형태의 원소들을 동시에 가질 경우 문자열이 아닌 원소도 모두 문자 형태로 인식합니다.

> class(num);class(c(1,2,3))
[1] "character"
[1] "numeric"

> v; class(v)
[1] "string" "123"    "3.14"   "one"    "two"    "three"  "TRUE"  
[1] "character"

 

 

 

2. 리스트 list()

 

위에서 다뤘던 벡터와 달리 리스트는 여러 형태의 원소들을 가질 수 있습니다. 예를 들어 숫자와 문자열 원소를 가지는 리스트를 만들어 확인한 결과 숫자 원소를 숫자로 인식하는 것을 확인할 수 있습니다.  리스트를 데이터프레임 형태로 변환하면 표 형태로 출력할 수 있습니다. 데이터프레임으로 변환한 후에도 숫자를 숫자로 인식합니다.

> temp=list(x=c(1,2), y=c("a","b"))
> temp
$x
[1] 1 2

$y
[1] "a" "b"

> class(temp$x)
[1] "numeric"

> print(as.data.frame(temp))
  x y
1 1 a
2 2 b

> df <- as.data.frame(temp)
> class(df[,1]) #df의 1열의 class
[1] "numeric"

 

변수를 미리 정의하지 않아도, list의 각 원소를 변수명=변수값 형태로 입력할 수 있습니다.

> data1<-list(name="kim", age=19, weight=48, use=TRUE)
> data1
$name
[1] "kim"

$age
[1] 19

$weight
[1] 48

$use
[1] TRUE

 

 

 

3. 1차원 자료의 슬라이싱(slicing)

 

벡터와 리스트의 슬라이싱은 방법이 동일합니다.

길이가 100이고 1부터 100까지의 자연수를 원소로 가지는 1차원 벡터 중 특정 순서에 있는 원소를 추출하려면 변수명[n]을 입력합니다. R에서의 슬라이싱은 1부터 시작합니다. 추출하고 싶은 원소가 여러 개라면 :와 c()를 이용하여 한번에 추출할 수 있습니다.

> num1 <- seq(1:100);length(num1)
[1] 100

> cat("num1의 5번째 원소: ", num1[5])
num1의 5번째 원소:  5
> cat("num1의 75~79번째 원소: ", num1[75:79])
num1의 75~79번째 원소:  75 76 77 78 79
> cat("num1의 2, 99~100번째 원소: ", num1[c(2, 99:100)])
num1의 2, 99~100번째 원소:  2 99 100

 

 

 

4. 2차원 자료의 슬라이싱

 

이번엔 2차원 리스트를 이용하여 원소를 추출하겠습니다.

rbind() 함수를 이용하면 각 data를 row(행)의 형태로, cbind() 함수를 이용하면 column(열)의 형태로 이어붙여 원소를 추가할 수 있습니다. 이렇게 이어 붙인 데이터에서 $를 이용하여 행 또는 열을 추출하려고 하면 null이 뜹니다.

> data2<-list(name="lee", age=43, weight=54 ,use=TRUE)
> data3<-list(name="jang", age=25, weight=73, use=FALSE)
> data<-rbind(data1, data2, data3)
> data
      name   age weight use  
data1 "kim"  19  48     TRUE 
data2 "lee"  43  54     TRUE 
data3 "jang" 25  73     FALSE

> data$age
NULL

 

2차원 자료에서의 슬라이싱은 원하는 위치의 [행, 열] 순서로 입력합니다. 만약 두번째 사람의 이름을 출력하고 싶다면 2행의 1열이므로 data[2,1]을 입력합니다. 모든 행에 대하여 특정 열을 추출하고 싶다면 행의 자리는 비우고 열의 위치만 입력합니다. 특정 행을 추출하고 싶은 경우 마찬가지로 열의 자리만 비우고 행의 위치를 입력합니다. 이 데이터에서 2열인 나이만 추출하고 싶다면 data[,2]를 입력합니다.

> data[[2,1]]
[1] "lee"

> data[,2]
$data1
[1] 19

$data2
[1] 43

$data3
[1] 25

 

1차원 자료와 마찬가지로 2차원 자료도 여러 열 또는 행에서 원소를 추출하고 싶다면 :와 c()를 이용합니다. 이 데이터에서 홀수번째 사람의 이름과 나이를 추출하고 싶다면 data[c(1,3), 1:2]를 입력합니다.

> data[c(1,3),1:2]
      name   age
data1 "kim"  19 
data3 "jang" 25

 

 

 

5. 원소 추가(삽입)

 

위에서 만들었던 one부터 three까지 3개의 문자열 원소를 가지는 벡터에 four부터 seven까지 4개의 원소를 추가하려면 c() 함수에 num과 추가하고 싶은 원소를 입력합니다. 추가할 원소가 1개라면 그냥 써도 되지만 2개 이상이라면 c() 를 이용하여 벡터로 만듭니다.

원하는 위치에 원소를 추가하고 싶다면 변수명[원하는 위치]에 추가할 원소를 할당합니다. 이때 길이가 7인 벡터에 9번째 원소를 삽입하면 8번째는 자동으로 결측값(NA)을 가집니다.

> num <- c("one", "two", "three")
> num <- c(num, c("four","five","six","seven"))
> num ; length(num)
[1] "one"   "two"   "three" "four"  "five"  "six"   "seven"
[1] 7

> num[9] <- "nine"
> num ; length(num)
[1] "one"   "two"   "three" "four"  "five"  "six"   "seven" NA      "nine" 
[1] 9

 

리스트의 원소 추가도 마찬가지로 c() 함수를 이용합니다. 3개의 원소를 가지는 리스트 num1에 새로운 원소를 추가하려면 c(num1, list(추가할 원소))를 입력합니다. 

위에서 사용했던 3명의 사람에 대한 이름, 나이, 몸무게, 사용여부 데이터와 같이 2차원 데이터라면 rbind() 또는 cbind() 함수를 이용하여 원소를 추가할 수 있습니다.

> num1 <- list(one=1, two=2, three=3)
> num1 <- c(num1, list(four=4))
> unlist(num1)
  one   two three  four 
    1     2     3     4

> data <- rbind(data, list(name="hwang", age=36, weight=61, use=TRUE))
> data
      name    age weight use  
data1 "kim"   19  48     TRUE 
data2 "lee"   43  54     TRUE 
data3 "jang"  25  73     FALSE
      "hwang" 36  61     TRUE

 

 

 

6. 원소 수정(변경)

 

원소의 수정은 슬라이싱을 이용합니다. 색깔에 대한 5개의 원소를 가지는 Colors 벡터에서 마지막 원소를 blue로 변경하려면 Colors[5]에 "blue"를 할당합니다. 

> Colors <- c("red", "orange" ,"yellow", "green", "black")
> Colors[5] <- "blue"
> Colors
[1] "red"    "orange" "yellow" "green"  "blue"

 

리스트에서도 마찬가지로 특정 원소를 변경하고 싶다면 슬라이싱을 이용합니다. 4명의 사람에 대한 data에서 마지막 사람의 몸무게를 61에서 62로 변경하고 싶다면 data[해당 위치]에 원하는 값을 할당하여 변경합니다.

> data[4,3] <- 62
> data
      name    age weight use  
data1 "kim"   19  48     TRUE 
data2 "lee"   43  54     TRUE 
data3 "jang"  25  73     FALSE
      "hwang" 36  62     TRUE

 

전처리(가변수 만들기)

 

괄호 부분에 TRUE값의 위치를 알려주는 which() 함수를 사용하면 데이터를 분석하기 전, 특정 원소를 분석이 가능한 값으로 바꾸는 전처리를 할 수 있습니다. 이를 이용하면 가변수(dummy variable)를 만들어 범주형 변수를 수치형 변수로 변환해보겠습니다. 예를 들어, 이항 분포를 따르는 로지스틱 회귀분석의 경우 종속변수(예측변수)인 Y의 값이 0, 1의 값을 가지는 이항 변수여야 분석이 가능합니다. 이때, 데이터의 종속변수의 값이 0, 1이 아닌 yes, no로 되어있다면 0을 no로, 1을 yes로 바꾸는 전처리 작업을 거쳐야 합니다. 0,1로 변환한 뒤 as.numeric() 함수를 이용합니다.

> data$Y[which(data$Y=="no")] <- 0
> data$Y[which(data$Y=="yes")] <- 1
> data$Y <- as.numeric(data$Y)

 

 

 

7. 원소 제거(삭제)

 

원소의 제거도 슬라이싱을 이용합니다. 1부터 100까지의 원소를 가지는 num1 벡터에서 50~59번째 원소를 제거하고 싶다면 남기고 싶은 원소들만 추출하여 슬라이싱 하거나 제거하고 싶은 범위 앞에 마이너스(-)를 붙여 슬라이싱 합니다. 두가지 방법으로 각각 num11, num12를 만들어 비교한 결과 90개의 모든 원소의 값이 같아 90개의 TRUE값이 나온 것을 확인할 수 있습니다.

> num11 <- num1[c(1:49, 60:length(num1))]
> num11 ; length(num11)
 [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21
[22]  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42
[43]  43  44  45  46  47  48  49  60  61  62  63  64  65  66  67  68  69  70  71  72  73
[64]  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94
[85]  95  96  97  98  99 100
[1] 90
> num12 <- num1[-c(50:59)]
> num12 ; length(num12)
 [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21
[22]  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42
[43]  43  44  45  46  47  48  49  60  61  62  63  64  65  66  67  68  69  70  71  72  73
[64]  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94
[85]  95  96  97  98  99 100
[1] 90
> sum(num11==num12)
[1] 90