본문 바로가기
반응형

5. 자료구조66

R 데이터프레임 원하는 값을 열에 추가하기 내장 데이터인 iris 를 이용하여 데이터프레임을 하나 만들어봅시다. > df=iris[1:5,] > df Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa 4 4.6 3.1 1.5 0.2 setosa 5 5.0 3.6 1.4 0.2 setosa 열을 하나 추가하고 싶은 상황입니다. 모든 값이 "hi"인 열을 만들고 싶습니다. 아래와 같이 cbind 함수를 이용하면 됩니다. > cbind(df,'hi') Sepal.Length Sepal.Width Petal.Length Petal.Width Species "hi" 1 .. 2022. 11. 25.
[R] 데이터 프레임을 특정 열 기준으로 정렬하기 데이터 프레임을 하나 정의합시다. A=c(5,4,7,6,2,1,3) B=c(1,2,3,4,5,6,7) df=data.frame(A,B) > df A B 1 5 1 2 4 2 3 7 3 4 6 4 5 2 5 6 1 6 7 3 7 A 열을 기준으로 정렬해보겠습니다. order 함수를 이용하여 A열의 행들의 크기 순서를 알아냅니다. > order(df$A) [1] 6 5 7 2 1 4 3 이 순서를 데이터프레임의 행 인덱싱에 사용하면 됩니다. > df[order(df$A),] A B 6 1 6 5 2 5 7 3 7 2 4 2 1 5 1 4 6 4 3 7 3 2022. 4. 2.
[R] 빈 데이터프레임 정의하고 for문으로 행 추가하기 아래는 한가지 예시이고 응용해서 사용하면 됩니다. #빈 데이터프레임을 정의합니다. df1=data.frame() #rbind를 이용하여 추가해줍니다. for (i in 1:10){ C1=i C2=i^2 C3=i^3 C4=i^4 df1=rbind(df1,c(C1,C2,C3,C4)) } #열 이름을 설정합니다. names(df1)=c("i","i^2","i^3","i^4") 아래는 결과입니다. > df1 i i^2 i^3 i^4 1 1 1 1 1 2 2 4 8 16 3 3 9 27 81 4 4 16 64 256 5 5 25 125 625 6 6 36 216 1296 7 7 49 343 2401 8 8 64 512 4096 9 9 81 729 6561 10 10 100 1000 10000 2022. 2. 8.
R 데이터프레임 쉽게 이해하기 사전지식 : R 벡터 데이터프레임은 여러개의 벡터를 이어놓은 것이라고 할 수 있습니다. 각 벡터가 데이터 프레임의 열이 됩니다. 예를 들어봅시다. 벡터를 세개 정의하겠습니다. > vec1=c(1,2,3,4,5) > vec2=c('a','b','c','d','e') > vec3=c(TRUE,TRUE,TRUE,FALSE,FALSE) 데이터 프레임으로 합쳐봅시다. 아래와 같이 data.frame 이라는 함수를 사용하고, 벡터를 콤마로 구분해주시면 됩니다. > df1=data.frame(vec1,vec2,vec3) > df1 vec1 vec2 vec3 1 1 a TRUE 2 2 b TRUE 3 3 c TRUE 4 4 d FALSE 5 5 e FALSE 벡터가 각 열에 들어간 것을 알 수 있습니다. 2021. 10. 18.
[R강의] 데이터프레임을 행렬로 바꾸는 방법 먼저 데이터프레임을 하나 정의합시다. > md=data.frame(C1=c(1,2,3),C2=c(10,20,30)) > md C1 C2 1 1 10 2 2 20 3 3 30 행렬로 바꾸는 함수는 as.matrix 입니다. > md_m=as.matrix(md) > md_m C1 C2 [1,] 1 10 [2,] 2 20 [3,] 3 30 잘 바뀌었는지 확인해봅시다. > class(md_m) [1] "matrix" "array" 2021. 10. 12.
[R기초] 데이터프레임을 벡터로 만드는 방법 데이터프레임을 벡터로 바꿀때는 unlist 함수를 사용합니다. 데이터프레임을 하나 정의합시다. > mydt=data.frame(c1=c(1,2,3),c2=c(10,20,30),c3=c(100,200,300)) > mydt c1 c2 c3 1 1 10 100 2 2 20 200 3 3 30 300 unlist 함수를 사용해봅시다. > myv=unlist(mydt) > myv c11 c12 c13 c21 c22 c23 c31 c32 c33 1 2 3 10 20 30 100 200 300 > str(myv) Named num [1:9] 1 2 3 10 20 30 100 200 300 - attr(*, "names")= chr [1:9] "c11" "c12" "c13" "c21" ... 벡터로 바뀌었습니다. 벡.. 2021. 5. 28.
[R 코딩] 행렬의 고유값과 고유벡터 행렬은 벡터의 선형변환입니다. 벡터에 행렬을 곱하면, 크기와 방향이 달라집니다. 하지만 어떤 경우에는 방향이 아니라 크기만 달라지는 경우가 있습니다. 이때 아래와 같은 등식이 성립합니다. A는 행렬, x는 벡터, 람다는 상수입니다. $$A\vec{x}=\lambda \vec{x}$$ 이를 행렬 입장에서 생각해봅시다. 어떤 행렬 A가 있습니다. 이 행렬에 어떤 벡터를 곱하면 벡터의 크기와 방향이 달라집니다. 그런데 어떤 벡터는 이 행렬과 곱해져도 방향이 변하지 않고 크기만 변합니다. $$A\vec{x}=\lambda \vec{x}$$ 이 벡터를 행렬 A의 '고유벡터'라고 합니다. 이때 크기 변화에 대한 상수 λ 를 '고유값' 이라고 합니다. R에서 어떤 행렬의 고유값과 고유벡터를 구하는 함수는 eigen .. 2020. 12. 24.
[R코딩] 행렬의 특잇값 분해 (svd) 행렬의 특잇값 분해는 아래와 같이 행렬 A를 U,D,V 세 행렬의 곱으로 나타내는 것입니다. (보통 D 대신 Σ 를 사용하는데, R 함수에서는 D를 사용합니다.) $A=UDV^{T}$ 특잇값 분해는 영어로 singular value decomposition 입니다. 줄어서 SVD 라고 부릅니다. R 함수 이름도 svd 입니다. singular value 를 한글로 옮긴 것이 '특잇값' 입니다. A,U,D,V 에 대한 설명은 아래와 같습니다. A : NxM 크기의 행렬 U : N차원 정방 직교 행렬 D : 대각행렬 V : M차원 정방 직교 행렬 아래는 R 예시입니다. > A=matrix(1:6,2) > A [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 > svd(A) $d [1] 9.5.. 2020. 12. 22.
[R코딩] 행렬을 이용한 연립방정식의 해 (solve) 아래와 같이 미지수가 3개인 연립방정식이 있다고 합시다. $$ a_{11}x+a_{12}y_+a_{13}z=b_{1}\\ a_{21}x+a_{22}y_+a_{23}z=b_{2}\\ a_{31}x+a_{32}y_+a_{33}z=b_{3} $$ 행렬형태로 바꾸면 아래와 같습니다. $$ \begin{bmatrix} a_{11} & a_{12} & a_{13}\\ a_{21} & a_{22} & a_{23}\\ a_{31} & a_{32} & a_{33} \end{bmatrix} \begin{bmatrix} x\\ y\\ z \end{bmatrix} = \begin{bmatrix} b_{1}\\ b_{2}\\ b_{3} \end{bmatrix} $$ 간단하게 아래와 같이 나타냅시다. $$[a]X=[b]$$ 이 .. 2020. 12. 21.
[R코딩] 행렬 열별 평균 구하기 (colMeans) R에서 행렬 열 별로 평균을 구하는 함수는 colMeans 입니다. 행렬을 하나 정의합시다. > m=matrix(1:12,3) > m [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,] 3 6 9 12 colMeans 함수를 이용하여 열별로 평균을 구해봅시다. > colMeans(m) [1] 2 5 8 11 2020. 12. 21.
[R코딩] 행렬 열 별로 합 구하기 (colsums) 행렬에서 열 별로 합을 구하는 함수는 colSums 입니다. 행렬을 하나 정의합시다. > m=matrix(1:12,3) > m [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,] 3 6 9 12 colSums 함수를 이용하여 열 별로 합을 구해봅시다. > colSums(m) [1] 6 15 24 33 2020. 12. 21.
[R코딩] 행렬의 행 별로 합 구하기 (rowSums) 행렬에서 행 별로 합을 구하는 함수는 rowSums 입니다. 행렬을 하나 정의합시다. > m=matrix(1:12,3) > m [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,] 3 6 9 12 rowSums 함수를 이용하여 행 별로 합을 구해봅시다. > rowSums(m) [1] 22 26 30 2020. 12. 21.
[R코딩] 행렬을 열 방향으로 연결 (cbind) R행서 행렬을 열 방향(좌->우)으로 연결할 때는 cbind함수를 사용합니다. 두 행렬이 열방향으로 연결되려면 두 행렬의 행의 크기가 같아야합니다. 두 행렬을 정의해봅시다. > m1=matrix(1:6,2) > m1 [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 > m2=matrix(1:4,2) > m2 [,1] [,2] [1,] 1 3 [2,] 2 4 cbind 함수를 이용하여 연결해봅시다. > cbind(m1,m2) [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 1 3 [2,] 2 4 6 2 4 2020. 12. 21.
[R코딩] 행렬을 행 방향으로 연결 (rbind) 두 행렬을 행 방향(위->아래)으로 연결할 때는 rbind 함수를 사용합니다. 두 행렬을 정의해봅시다. 행 방향으로 연결하려면 두 행렬의 열의 크기가 같아야 합니다. > m1=matrix(1:6,2) > m1 [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 > m2=matrix(1:9,3) > m2 [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 rbind 함수를 이용하여 연결해봅시다. > rbind(m1,m2) [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 [3,] 1 4 7 [4,] 2 5 8 [5,] 3 6 9 2020. 12. 21.
[R코딩] 행렬의 곱 (%*%) R에서 행렬의 곱을 수행하는 함수는 %*% 입니다. 행렬을 하나 정의합시다. > m1=matrix(1:4,2) > m1 [,1] [,2] [1,] 1 3 [2,] 2 4 m1과 m1을 곱하는 행렬의 곱을 해봅시다. > m1%*%m1 [,1] [,2] [1,] 7 15 [2,] 10 22 행렬과 행렬을 곱할 때는, 앞 행렬의 열의 수와 뒤 행렬의 행의 수가 같아야 합니다. 두 행렬을 정의합시다. m2 는 2행3열, m3는 3행3열의 행렬입니다. > m2=matrix(1:6,2) > m2 [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 > m3=matrix(1:9,3) > m3 [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 m2의 열의 수와 m3의 행.. 2020. 12. 21.
[R기초] 대각행렬을 생성하는 diag 함수 대각행렬은 대각선 방향을 제외한 나머지 값이 0인 행렬입니다. R에서는 diag 함수를 이용하여 생성합니다. diag(값,행의수,열의수) 예를들면 아래와 같습니다. > diag(1,4,4) [,1] [,2] [,3] [,4] [1,] 1 0 0 0 [2,] 0 1 0 0 [3,] 0 0 1 0 [4,] 0 0 0 1 2020. 12. 20.
[R 코딩] 전치행렬 구하는 함수 (t) R에서 전치행렬을 구할 때는 t 함수를 사용합니다. 행렬을 하나 정의합시다. > m=matrix(1:4,2) > m [,1] [,2] [1,] 1 3 [2,] 2 4 전치행렬을 구해봅시다. > t(m) [,1] [,2] [1,] 1 2 [2,] 3 4 2020. 12. 18.
[R 코딩] 역행렬 구하는 함수 (solve) R에서 역행렬을 구할 때는 solve 함수를 사용합니다. 행렬을 하나 정의합시다. > m=matrix(1:4,2) > m [,1] [,2] [1,] 1 3 [2,] 2 4 역행렬을 구해봅시다. > m_inv=solve(m) > m_inv [,1] [,2] [1,] -2 1.5 [2,] 1 -0.5 역행렬이 맞는지 확인합시다. 둘을 곱하여 단위행렬이 나오면 됩니다. > m_inv=solve(m) > m_inv [,1] [,2] [1,] -2 1.5 [2,] 1 -0.5 2020. 12. 18.
[R 코딩] 모든 원소가 0인 행렬 만들기 파이썬 넘파이나 매트랩의 zeros 와 같은 역할입니다. R에서 행렬을 정의할 때, 벡터가 들어가는 자리에 0을 넣으면 됩니다. 3행 5열의 zeros 행렬을 만들어봅시다. > matrix(0,3,5) [,1] [,2] [,3] [,4] [,5] [1,] 0 0 0 0 0 [2,] 0 0 0 0 0 [3,] 0 0 0 0 0 2020. 12. 18.
[R 코딩] 리스트에서 특정 조건으로 요소 제거하기 리스트에서 특정 조건으로 요소를 제거하는 방법입니다. 예를들어 "문자열"만 제거한다던가, NA 요소를 제거하는 것입니다. discard 함수 안에 is 함수를 사용하면 됩니다. 리스트를 하나 정의해봅시다. > li=list(1,"a",2,"b",NA) > li [[1]] [1] 1 [[2]] [1] "a" [[3]] [1] 2 [[4]] [1] "b" [[5]] [1] NA 문자열만 제거해보겠습니다. > discard(li,is.character) [[1]] [1] 1 [[2]] [1] 2 [[3]] [1] NA 숫자를 제거할 때는 is.numeric, NA를 제거할 때는 is.na 를 대신 넣으면 됩니다. 2020. 12. 18.
[R 코딩] 리스트안 NULL 요소 일괄제거 방법 (compact 함수) 리스트 안에 NULL 요소가 있는 경우가 있습니다. NULL 요소를 제거할 때는 purrr 라이브러리의 compact 함수를 사용합니다. purrr은 tidyverse 세계관이므로, tidyverse 패키지를 불러와도 됩니다. library(purrr) #또는 library(tidyverse) NULL 요소가 있는 리스트를 하나 정의해봅시다. > li=list(A=1,B=2,C=NULL,D=NULL,E=3) > li $A [1] 1 $B [1] 2 $C NULL $D NULL $E [1] 3 compact 함수를 적용하여 NULL 요소를 제거합시다. > compact(li) $A [1] 1 $B [1] 2 $E [1] 3 2020. 12. 17.
[R코딩] 리스트 요소를 제거하는 방법 리스트의 요소를 제거할 때는 인덱싱 후 NULL을 입력하면 됩니다. 먼저 리스트를 하나 만들어봅시다. 네 사람의 수학점수입니다. > names=c("Tim","Marry","Kitkat","Rorry") > math=c(86,78,46,23) > li=list() > list[names]=math > li $Tim [1] 86 $Marry [1] 78 $Kitkat [1] 46 $Rorry [1] 23 팀의 점수를 없애봅시다. > li["Tim"]=NULL > li $Marry [1] 78 $Kitkat [1] 46 $Rorry [1] 23 2020. 12. 16.
[R 코딩] 이름과 내용을 각각 벡터로 정의하고 리스트 만들기 이름과 내용을 각각 벡터로 정의하고 리스트를 만들 수도 있습니다. 먼저 이름과 내용을 각각 정의합시다. 다섯사람의 수학점수라고 합시다. > names=c("Tim","Marry","Kitkat","Rorry") > math=c(86,78,46,23) 비어있를 리스트를 하나 정의합시다. > li=list() 아래와 같이 이름과 내용을 리스트에 입력합시다. > li[names]=math > li $Tim [1] 86 $Marry [1] 78 $Kitkat [1] 46 $Rorry [1] 23 2020. 12. 16.
[R코딩] 리스트 인덱싱 할때, 요소 자체의 자료형으로 출력 리스트를 인덱싱할 때, 요소를 리스트 형태로 출력할 수도 있고 요소 자체의 자료형으로 출력할 수도 있습니다. 먼저 리스트를 하나 정의합시다. > li=list(v=c(1,2,3),m=matrix(1:4,2),df=data.frame(a=c(1,2,3),b=c(4,5,6))) > li $v [1] 1 2 3 $m [,1] [,2] [1,] 1 3 [2,] 2 4 $df a b 1 1 4 2 2 5 3 3 6 리스트 형태로 인덱싱 대괄호를 한겹만 사용합니다. > li[1] $v [1] 1 2 3 > li[2] $m [,1] [,2] [1,] 1 3 [2,] 2 4 > li[3] $df a b 1 1 4 2 2 5 3 3 6 자료형을 확인해봅시다. > class(li[1]) [1] "list" > class(.. 2020. 12. 16.
[R 코딩] 데이터프레임 에서 엑셀스타일, SPSS스타일 데이터 변환 (stack함수) 엑셀과 SPSS에서 통계분석을 할 때 요구되는 데이터 스타일이 다릅니다. 남녀의 키를 비교한다고 할 때, 아래와 같이 각각 데이터를 정리해주어야 합니다. 이때 사용되는 함수가 stack 함수입니다. stack 함수의 사용 엑셀스타일의 데이터프레임을 정의합시다. > df1=data.frame(male=c(177,183,162,166),female=c(172,156,162,166)) > df1 male female 1 177 172 2 183 156 3 162 162 4 166 166 stack 함수를 사용해봅시다. > stack(df1) values ind 1 177 male 2 183 male 3 162 male 4 166 male 5 172 female 6 156 female 7 162 female 8.. 2020. 12. 16.
[R 코딩] 리스트를 데이터프레임으로 만드는 stack 함수 stack 함수를 이용하면 리스트를 데이터프레임으로 만들 수 있습니다. 왜 리스트를 데이터프레임으로 바꾸는지, 어떻게 바뀌는지는 예제를 통해 이해할 수 있을것입니다. 단, 벡터나 factor가 들어있는 리스트만 가능합니다. 예를들어 한국,미국,영국 세 나라에서 다섯사람씩 모였고 이들의 나이를 리스트레 저장했다고 합시다. > li=list(kor=c(23,42,66,36,72),us=c(11,16,25,66,73),uk=c(16,5,34,25,12)) > li $kor [1] 23 42 66 36 72 $us [1] 11 16 25 66 73 $uk [1] 16 5 34 25 12 위 리스트에 stack 함수를 적용한 결과는 아래와 같습니다. > stack(li) values ind 1 23 kor 2 4.. 2020. 12. 16.
[R] 데이터프레임 인덱싱을 쉽게 하는 법 (subset 함수) subset 함수를 이용하면 데이터프레임의 인덱싱을 아주 편하게 할 수 있습니다. 아래 데이터를 봅시다. airquality 라는 내장데이터입니다. > 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 인덱싱을 해봅시다. wind 가 10 이상인 경우만 인덱싱해봅시다. airquality[airquality$Wind>=10,] subset 함수를 이용하면 아래와 같이 인덱싱이 가능합니다. subset(airquality,Wind>=10) subset.. 2020. 12. 15.
[R 코딩] list 를 벡터로 만들기 (unlist 함수) 벡터, 행렬, 데이터프레임을 하나씩 정의하여 list에 넣어봅시다. > v=c(1,2,3) > m=matrix(1:4,2) > df=data.frame(a=c(10,20,30),b=c(40,50,60)) 리스트에 넣은 결과입니다. > ml=list(v,m,df) > ml [[1]] [1] 1 2 3 [[2]] [,1] [,2] [1,] 1 3 [2,] 2 4 [[3]] a b 1 10 40 2 20 50 3 30 60 리스트에 unlist 함수를 적용해봅시다. > unlist(ml) a1 a2 a3 b1 b2 b3 1 2 3 1 2 3 4 10 20 30 40 50 60 벡터로 변한것을 알 수 있습니다. 2020. 12. 15.
[R 코딩] 벡터의 원소 반복 규칙 원소 반복규칙의 예시는 아래와 같습니다. > c(1,2,3)+c(1,2,3,4,5,6) [1] 2 4 6 5 7 9 길이가 다르지만 길이가 짧은 벡터가 반복되며 모자란 부분을 채웁니다. cbind 함수에도 적용됩니다. > cbind(1:2,1:5) [,1] [,2] [1,] 1 1 [2,] 2 2 [3,] 1 3 [4,] 2 4 [5,] 1 5 Warning message: In cbind(1:2, 1:5) : number of rows of result is not a multiple of vector length (arg 1) 2020. 12. 15.
[R 코딩] 벡터 중간에 데이터 삽입 벡터 중간에 데이터를 삽입할 때는 append 함수를 사용합니다. 아래와 같은 형식입니다. append(벡터,삽입할데이터,after=n) 아래와 같은 벡터가 있다고 합시다. v1=c(10,20,30,40,50) 이 벡터의 세번째와 네번째 원소 사이에 c(1,2,3)을 삽입해봅시다. > append(v1,c(1,2,3),after=3) [1] 10 20 30 1 2 3 40 50 2020. 12. 15.
반응형