본문 바로가기

배우기/복습노트[R과 분석]

[복습] R(programming language) 자료구조(벡터) (2)

728x90
반응형

https://metime.tistory.com/96

 

[복습] R(programming language) 의 자료구조(벡터, 데이터 프레임) + 복습후기(20231121)

R의 자료구조에는, 0. 스칼라 1. 벡터 2. 리스트 3. 행렬 4.배열 5. 데이터 프레임 이 있다. 오늘은 벡터와 데이터 프레임에 대하여 배웠다. 이와 비교하여 먼저 스칼라란, 하나의 상수로 자료의 구조

metime.tistory.com

 

이 글에 이어서 다시 벡터와 데이터 프레임 정리를 해보았다.

 

개념 정도는 위 게시글에서 다시 확인하고,

 

[벡터]

 

1. 생성

여기서 주의할 점 한 가지를 더 강조하자면, 한 벡터의 데이터 타입은 동일해야하며, 서로 다른 데이터 타입을 선언할 수 없다. v1 <- c(1,2,3,'4') 로 선언하면 문자타입으로 모두 변경된다.

 

2. 구조

Line 2처럼 선언하면 각 원소의 이름을 부여할 수 있다.

원소의 이름을 삭제하려면 Line 4처럼 NULL을 넣으면 된다.

원소의 수를 구하는 방법은 Line 6과 같이 length 함수 안에 벡터를 넣으면 된다.

 

3. 색인

v1[1] : 위치 색인이 가능하다(positional indexing)

           위치 색인 시 마이너스 입력이 가능하며, 마이너스 입력 시 제외의 기능을 한다.

            label indexing의 경우에는 마이너스 입력이 불가하다.

v1['a'] : 이름 색인이 가능하다(label indexing)

v1[1:3] :   slice indexing. 문자는 불가하다. 즉 v1['a':'c'] 는 에러가 난다.

v1 > 3 : 조건 인덱싱이 가능하다(boolean indexing).

 

4. 수정

모든 수정은 덮어쓰면 가능하다.

 

  4-1) update

 

Line 2과 같이 하나의 값만 수정이 가능하다.

Line 4처럼 저장하면 첫 번째와 두 번째 값이 모두 100으로 수정된다.

그러나 Line 6처럼 자료의 개수가 일치하지 않는 경우는 에러가 발생한다,

length오류는 자료의 길이가 맞지 않는 경우이며,  demension 오류는 자료 차원이 맞지 않다.

 

이렇게 조건을 주어 자료를 수정하는 것도 가능하다.

 

 

  4-2) append

두 개의 벡터를 묶어도 벡터가 추출된다. 원소의 확장 개념이다. 벡터는 1차원이기 때문에 두 벡터를 묶는다고 하여 하위 depth가 발생하지 않는다.

예를 들어 위와 같이 두 벡터를 한 벡터로 묶게 되면 자료가 벡터형으로 출력이 되며,

기존 벡터와 새로운 값 하나를 벡터로 묶으면 기존 벡터에 새로운 값이 하나 추가된다.

 

Line 3 방법으로는 기존 벡터에 값을 맨 앞이나 맨 뒤에만 추가할 수 밖에 없는데 중간에 값을 넣기 위해서는 append라는 함수를 사용하면 된다.

 

append(x,                          #대상

             values =  ,            #추가할 값

              after =    )            #위치

 

의 형식이다.

이렇게 넣으면 30이라는 값을 세 번째 뒤로 추가하라는 의미이므로 네 번째 원소의 값이 30으로 추가된다.

a

따라서 원소 추가는 두 가지 방법이 있는데, 첫 번째 방법은 중간 삽입이 불가능하다. 앞 뒤로만 추가가 가능하며, append를 이용하면 중간에 추가가 가능하다.

 

728x90

 

 

연습문제를 풀어보자

1. emp에서 SMITH의 SAL을 3000으로 수정하여라

 

2. emp에서 10번 부서를 40번으로 변경하여라

 

아래 벡터에 대하여 각 원소 이름을 A, B, C, D, E로 변경 후 BCD를 bcd로 수정하여라(원소 이름 수정)

v1 <- 1:5

 

내 풀이

방법을 몰라서 그냥 새로 만들어 덮어씌우기로 해결하였다.

 

이 문제에서 중요한 것을 설명해주셨다.

 

아래는 두 가지 풀이 방법이 아니라 학생들이 실수하는 접근 법에 대하여 설명한 내용이다.

sol1은 틀린 내용이며 sol2가 맞는 내용이다.

결론부터 작성하면

sol1) 일부 원소 선택 후 이름 수정

sol2) names에서 일부 선택 후 수정

이렇게 두 가지 방법이다.

 

so1)은 결국 정답이 출력되지 않는다.

이렇게 작성하는 방법인데, names(v1[2:4]) 실존하지 않지만 실존하는 것처럼 작성한 방법이다. 즉 SQL의 인라인뷰 같은 느낌이다. 

우선 A, B, C, D, E도 객체같은 것이다. 우리가 선언했기 때문이다.

그런데 원본에서 파생된 객체의 수정은 불가하다. 원본에 영향을 미치지 않기 때문이다.

그래서 이 방법이 불가한 것이다.

그러나 SQL은 

 update (select sal

                 from emp)

      set sal = 5000;

하면 수정된다. 원본이 아니더라도, 원본에서 파생된 객체라도 수정이 가능하다. 하지만 현업에서는 쓰지 않는다. 굳이 간접적으로 수정할 필요는 없는 것이다. 

에러가 안떠서 착각하는 경우가 많은데, 메모리상에 어딘가 수정은 됐겠으나 원본은 수정이 되지 않는다.

그러므로 안 된다고 생각하여야 한다. 파생된 객체의 수정은 원본과 맺어지지 않는다.

즉 원본에 직접 수정하는 방식이 아닌 원본으로부터 파생된 객체의 수정은 원본에 영향을 미치지 않는다.

 

그러나 sol2) 처럼 이미 정의된 객체를 수정하는 것은 가능하다.

 

 

5. 연산

a1과 a2는 길이가 같다.

그래서 Line 3처럼 계산하면 같은 위치끼리 더해진 결과가 출력된다

그런데 a3는 길이가 2이다.

여기서 a1과 a3을 더하면 a3을 a1길이에 맞게 반복하여 합하게 된다.

즉 크기가 같은 벡터끼리는 언제나 연산이 가능하다(같은 위치끼리)

크기가 서로 다른 벡터끼리도 연산이 가능한데 bradcast 기능이라고 하며 작은 쪽을 반복하여 큰 쪽의 수에 맞추어 연산한다.

 

 

여기까지가 벡터 끝!

728x90
반응형