페이스북의 KRUG (Korean R User Group) 에서 2017.11.18일 주말 퀴즈로 아래의 시각화를 푸는 문제가 있어서 재미로 풀어보았습니다. 


처음엔 금방 코드 짤 것으로 예상했는데요, 출제자분께서 중간 중간 장애물을 심어놓으셔서 제 예상보다 좀 더 걸렸네요. 


문제 풀면 KRUG 운영자분께서 스타벅스 기프티콘 주신다고 하는데요, 기대되네요. ^___^



# KRUG's plot quiz, as of 18th NOV. 2017


library(ggplot2)

#install.packages("dplyr")

library(dplyr)

str(mtcars)


# making 'model' variable

mtcars$model <- rownames(mtcars)


# ordering by cyl, hp

mtcars_ord <- arrange(mtcars[,c('model', 'cyl', 'hp')], cyl, desc(hp))


# marking an inflection point within cluster : threshold >= 40

mtcars_cyl <- c(4, 6, 8)

mtcars_ord_2 <- data.frame()


for (i in 1:length(mtcars_cyl)) {

  

  mtcars_tmp <- subset(mtcars_ord, subset = (cyl == mtcars_cyl[i]))

  

  for (j in 1:nrow(mtcars_tmp)) {

    if (j != nrow(mtcars_tmp) & mtcars_tmp$hp[j] - mtcars_tmp$hp[j+1] >= 40) {

      mtcars_tmp$hp_outlier[j] = '1_outlier'

    } else {

      mtcars_tmp$hp_outlier[j] = '2_normal'

    }

  }

  

  mtcars_ord_2 <- rbind(mtcars_ord_2, mtcars_tmp)

  rm(mtcars_tmp)

}


# converting cyl variable type from numeric to factor

mtcars_ord_2$cyl_cd <- paste0("cyl :", mtcars_ord_2$cyl)


model_order <- mtcars_ord_2$model[order(mtcars_ord_2$cyl_cd, 

                                        mtcars_ord_2$hp, 

                                        decreasing = FALSE)]


mtcars_ord_2$model <- factor(mtcars_ord_2$model, levels = model_order)



# drawing cleveland dot plot

ggplot(mtcars_ord_2, aes(x = hp, y = model)) +

  geom_point(size = 2, aes(colour = hp_outlier)) +

  scale_colour_manual(values = c("red", "black")) + 

  theme_bw() +

  facet_grid(. ~ cyl_cd, scales = "free_y", space = "free_y") +

  xlim(0, max(mtcars_ord_2$hp)) +

  geom_hline(yintercept = nrow(mtcars_ord_2[mtcars_ord_2$cyl == 4,]) + 0.5, 

             colour = "black", linetype = "dashed", size = 0.5) +

  geom_hline(yintercept = nrow(mtcars_ord_2) - 

               nrow(mtcars_ord_2[mtcars_ord_2$cyl == 8,]) + 0.5, 

             colour = "black", linetype = "dashed", size = 0.5) +

  theme(legend.position = 'none')

 




R Korea - KRUG(Korean R User Group) 에 문제 출제해주신 정우준님께서 나중에 정답지 올려주신 코드도 아래에 같이 공유합니다. 제가 짠 코드보다 한결 간결하네요. 



library(data.table)
library(dplyr)
library(ggplot2)

mtcars %>%
mutate(car.name=rownames(.)) %>%
arrange(cyl, hp) %>%
mutate(order.key=1:n()) -> data

data %>%
ggplot(aes(x=hp, y=reorder(car.name, order.key))) +
geom_point(
colour=case_when(
data$car.name %in% c('Ferrari Dino','Maserati Bora') ~ 'red', 
TRUE ~ 'black')) +
geom_hline(yintercept = 11.5, linetype='dashed') +
geom_hline(yintercept = 18.5, linetype='dashed') +
facet_wrap(~ cyl, labeller = label_both) +
scale_x_continuous(limits=c(0,max(data$hp))) +
theme_bw() +
theme(axis.title.y=element_blank())

 






저작자 표시 비영리 변경 금지
신고
Posted by R Friend R_Friend

지난번 포스팅에서는 파이썬 프로그램 흐름 제어의 2가지 큰 뼈대 중에서 


(1) 조건이 참(True), 거짓(False)인지에 따라 프로그램 흐름을 나누어 주는 분기문 (Branch statements) 로서 


 - if statements

 - if, else statements

 - if, elif, else statements

 - nested if statements


에 대해서 알아보았습니다. 



이번 포스팅에서는 파이썬 프로그램 흐름 제어의 두번째 주제로서 


(2) 조건이 참이거나 순서열의 끝까지 반복, 중단하게 해주는 반복문(Loop statements) 으로서 


 - while: 조건이 참인 동안 반복 (loop while the condition is True)

 - for: 순서열의 처음부터 끝까지 반복 (loop until the end of the sequence)

 - continue: 조건이 참이면 반복문 계속 (continue loop if the condition is True)

 - break: 조건이 참이면 반복문 중단 (stop loop if the condition is True)


에 대해서 알아보겠습니다. 


반복문(Loop statement)을 잘 사용하면 단순 반복 작업을 컴퓨터에게 시킬 수 있으므로 분석가, 프로그래머에게 소중한 시간을 절약할 수 있게 해주어 매우 유용합니다. 



[ 파이썬 프로그램 흐름 제어 : 반복문 (Loop statement) ]





먼저 while 반복문부터 살펴보겠습니다. 


 (1) while: 조건이 참인 동안 반복 (loop while the condition is True)


while 문은 조건(condition)이 참(True) 인 동안 계속 반복하게 해줍니다. 


for 문은 순서열(sequence)의 항목(item)을 처음부터 끝까지 반복하는데 반해, while 문은 조건(condition)이 참(True)인 동안 반복한다는 차이점이 있습니다. 따라서, for 문처럼 처음과 끝을 알 수 없고, 그저 조건(condition) 을 만족하는 동안에는 반복을 시키고 싶으면 while 반복문을 사용하면 되겠습니다. 


[Syntax of while loop in python]

while condition:

    conditional code block 


while 반복문은 위의 Syntax 처럼 while 다음에 조건(condition)을 써주고 끝에 콜론(colon, :)을 꼭 붙여주어야 합니다. 그 다음줄부터는 조건이 참(condition is True)인 경우에 반복 실행시키고자 하는 code block을 써주는데요, 이때 들여쓰기(indentation)을 해주어야 합니다.(spyder 같은 IDE를 사용하면 알아서 들여쓰기 해주어서 편함)




(1-1) while 반복문


처음에 '0'부터 시작해서 '1'씩 더해가는 과정을 반복하면서, 그 결과값이 '5 미만'인 조건을 만족하는 한(while) 계속해서 그 값을 출력하고 '1'씩 더해가는 반복작업을 하는 아주 간단한 예제를 들어보겠습니다. 


while 반복문

실행 결과 (result)

count = 0

while count < 5:

    print('count : ', count)

    count = count + 1

    

print('The end')

count : 0

count : 1

count : 2

count : 3

count : 4

The end




(1-2) else 조건문과 함께 사용하는 while 반복문


while 반복문에 else 조건문을 같이 사용할 수 도 있습니다. 

아래에 '0' 부터 시작해서 '1'씩 더해가는 과정을 반복하면서, 그 결과 값이 '5 미만'인 조건을 만족하는 한(while) 계속해서 '5보다 작다'를 출력하고 이전 값에 '1'씩 더해가며, '5 미만' 조건을 만족하지 않으면(else) '5보다 작지 않다'를 출력하고 반복을 멈추는 예제를 들어보겠습니다. 


while 반복문 

실행 결과 (result) 

count = 0

while count < 5:

    print(count, ' is less than 5')

    count = count + 1

else:

    print(count, ' is not less 5 so stop here') 

0  is less than 5

1  is less than 5

2  is less than 5

3  is less than 5

4  is less than 5

5  is not less 5 so stop here




(1-3) 무한 반복문 (infinite loop)


while 반복문의 조건을 True 로 해놓으면 컴퓨터의 전원을 끄지 않는 한 계속해서, 무한 반복(infinite loop)하게 됩니다. 무한 반복을 어디에 써먹을 수 있을까 싶을 텐데요, 서버처럼 연중 무중단 운영을 하는 경우 유용하게 사용할 수 있습니다. (while(True): 또는 while True: )


아래 예제에서는 무한반복해서 프린트하는 것을 spyder의 우측 상단의 중단 단추를 눌러서 강제로 종료시켰습니다. (KeyboardInterrupt)


while 반복문 (infinite loop)

실행 결과 (result) 

 # Infinite loop

while(True):

    print('Infinite loop goes on and on ...')

Infinite loop goes on and on ...

Infinite loop goes on and on ...

Infinite loop goes on and on ...


File "zmq/backend/cython/checkrc.pxd", line 12, in zmq.backend.cython.checkrc._check_rc (zmq\backend\cython\socket.c:9621)


KeyboardInterrupt



while 무한 반복문(while True: )에 지난번 포스팅에서 살펴보았던 if, elif, else 분기문과 break 반복문 제어문을 같이 사용할 수도 있겠지요?  아래는 사용자로부터 input()으로 answer 를 받아서, answer 별로 다른 메시지를 출력하는 과정을 무한 반복(while True:  이므로...)하되, elif 조건에 해당하면 무한반복을 중단(break) 하도록 하는 예제입니다. 말로 설명하려니 너무 주저리주저리 인데요, 아래 코드와 실행 결과를 살펴보시면 이해가 금방 갈 겁니다. 


 while 반복문 (with if, elif, else & break)

실행 결과 (result) 

while True:

    print('continue or stop? [continue/stop]:')

    answer = input()

    

    if answer == 'continue':

        print('>> continue again!')

    elif answer == 'stop':

        print('>> stop here!')

        break

    else:

        print('>> wrong answer!')

continue or stop? [continue/stop]:


continue

>> continue again!

continue or stop? [continue/stop]:


repeate

>> wrong answer!

continue or stop? [continue/stop]:


continue

>> continue again!

continue or stop? [continue/stop]:


stop

>> stop here!




 (2) for:  순서열의 처음부터 끝까지 반복 (loop until the end of the sequence)


다음으로 for 반복문입니다. while 반복문이 조건(condition)이 참(True) 인 경우에 반복을 하는 반면에, for 반복문은 순서열(sequence)의 항목(item)을 처음부터 끝까지 순서대로 거쳐가면서 반복을 하게 됩니다. 




[Syntax of for loop statement in python]

for iterating_var in sequence:

    code block 


for 반복문은 'for' 다음에 '반복 변수(iterating_var)'를 지정해주고 'in' 다음에 순서열(sequence), 그리고 마지막에 '콜론(colon, :)을 써줍니다. 그리고 그 다음줄에 반복을 시킬 code block 을 써주면 되는데요, 이때 들여쓰기(indentation)을 해주어야 합니다. (IDE를 사용하면 자동으로 들여쓰기 해줌)



파이썬의 순서열에는 문자열(string), 튜플(tuple), 리스트(list), 사전(dictionary), Range 등이 있습니다. 


저는 특히 업무에서는 데이터 프레임을 만들어서 행(column)이나 열(row)의 개수를 세어서 range() 함수와 함께 for 반복문을 만들어서 자주 쓰곤 합니다. 



(2-1) for 반복문 : with Range


for 반복문과 함께 range(start, end, interval) 함수를 사용해서 'start' 부터 'end' 보다 작은 정수값을 'interval' 정수값 만큼 간격을 두고 증가하는 순서열을 만들어보겠습니다. 


range() 함수의 매개변수 start, end, interval 사용 시, 

 - 매개변수 'end' 의 순서열 항목은 포함이 되지 않으며,

   (아래 예제에서 range(0, 5, 1) 실행결과에서 '5'는 빠져있음. R 사용자가 헷갈리기 쉬우므로 주의 요망) 

 - 매개변수 'interval'로 순서열의 간격을 설정할 수 있으며, 

 - 매개변수 'interval'을 생략하면 순서열의 간격은 '1'이 디폴트이고, 

 - 매개변수 'start'을 생략하면 순서열은 '0'부터 디폴트로 시작하고, 

 - 정수만 인식하고 부동소수형(float)은 TypeError 가 발생합니다. 


 for i in range(start, end, interval)

실행 결과 (result) 

for i in range(0, 5, 1): # (start, end, interval)

    print(i)

0

1

2

3

4

for i in range(3, 10, 2):

    print(i)

3

5

7

9

for i in range(0, 5): # interval default : 1

    print(i)

0

1

2

3

4

for i in range(5): # start default : 0

    print(i)

0

1

2

3

4

for i in range(5, 5):

    print(i)

(no result)

# TypeError

for i in range(4.9, 5):

    print(i)

Traceback (most recent call last):


  File "<ipython-input-11-bb2a792a3440>", line 1, in <module>

    for i in range(4.9, 5):


TypeError: 'float' object cannot be interpreted as an integer



for 문을 복수번 사용하는 것도 가능합니다. 

for 반복문과 range() 함수를 두번 사용해서 1~5 사이의 정수에서 2개씩 뽑은 모든 조합 (즉, 5C2) 의 합을 구해보는 예제입니다. 


for i in range() 복수 반복문

실행 결과 (result) 

for i in range(1, 6):

    for j in range(i+1, 6):

        print(i, '+', j, '=', i+j)

1 + 2 = 3

1 + 3 = 4

1 + 4 = 5

1 + 5 = 6

2 + 3 = 5

2 + 4 = 6

2 + 5 = 7

3 + 4 = 7

3 + 5 = 8

4 + 5 = 9



(2-2) for 반복문 with 튜플(tuple)


파이썬의 순서열 중에서 이번에는 튜플(tuple)을 사용하여 for 반복문을 만들어보겠습니다. 튜플 안의 원소들을 하나씩 순회하면서 프린트를 해주는 코드입니다. 


for i in tuple

실행 결과 (result) 

for i in ('Python', 'is', 'easy'):

    print(i)


print('Really?')

Python

is

easy

Really?



바로 위의 예제와 동일한 결과를 반환하는 for loop 반복문을 range(len(tuple)) 과 tuple[index] 를 함께 사용하여 프로그래밍할 수도 있습니다. 위의 코드에 비하면 길기도 하고, 좀 복잡해 보이기도 하는데요, 만약 튜플의 길이가 길다면 아래의 방법으로 코딩하는 것이 더 깔끔할 수도 있으니 같이 알아 두시면 좋겠습니다. 


for loop with range() & tuple index

실행 결과 (result) 

# iterating by sequence index


mytuple = ('Python', 'is', 'easy')


for index in range(len(mytuple)):

    print(mytuple[index])


print('Really?')

Python

is

easy

Really? 



(2-3) for 반복문 with 리스트(list)


리스트도 순서열의 하나 이므로 위의 튜플 예제와 유사하게 for 반복문을 만들 수 있습니다. 리스트(list) 안에 있는 원소들을 순서대로 순회하면서 프린트하는 예제 코드입니다. 


for i in list

실행 결과 (result) 

for mylist in ['Python', 'is', 'easy']:

    print(mylist)


print('Are you sure?') 

Python

is

easy

Are you sure? 



(2-4) for 반복문 with 문자열(string)


문자의 순서열(sequence of character)인 문자열(string)도 마찬가지로 for 반복문이 가능합니다. 문자열의 개별 문자(character)와 공백(space) 하나 하나 별로 순회하면서 끝의 원소까지 프린트하는 예제 코드입니다. 


for i in string

실행 결과 (result) 

for mystr in ('Python is easy'):

    print(mystr)

print('--The end of string character--')

P

y

t

h

o

n

 

i

s

 

e

a

s

y

--The end of string character--



(2-5) for 반복문 with 사전(dictionary) & 튜플 분해(tuple unpacking)


사전(dictionary) 자료형의 경우는 dic.items()로 먼저 튜플 분해(tuple unpacking, 한글로 번역을 어케해야 할까요...? ^^;)를 해서 for 반복문에 사용하면 됩니다.  고객 ID와 이름의 짝(ID, Name pair)을 이룬 사전 자료형을 순서대로 프린트하도록 하는 for 반복문 예제입니다. 


for i in dictionary

실행 결과 (result) 

mydic = {'cust_01': 'kim'

            'cust_02': 'lee'

            'cust_03': 'choi'}


for key, val in mydic.items(): # tuple unpacking

    print("ID is '{0}' and NAME is '{1}'".format(key, val))

ID is 'cust_01' and NAME is 'kim'

ID is 'cust_02' and NAME is 'lee'

ID is 'cust_03' and NAME is 'choi'




3. continue: 조건이 참이면 반복문 계속 (continue loop if the condition is True)

     break: 조건이 참이면 반복문 중단 (stop loop if the condition is True)


(3-1) continue 반복 제어문


continue 는 조건이 참(True)일 때 continue 아래 부분의 code block 을 실행하지 않고 처음의 반복 부분으로 되돌아가서 반복 loop을 계속하도록 해줍니다. 


아래 예제는 for 반복문과 continue 반복 제어문을 사용해서 '1'부터 '5'까지의 정수로 이루어진 range 순서열에서 짝수(even number)이면 반복 문의 처음으로 되돌아가고, '홀수'(odd number)이면 프린트해주는 코드입니다. 


for 반복문 with continue 제어문

실행 결과 (result) 

# print only odd numbers b/w 1 ~ 5

for i in range(1, 6):

    if i % 2 == 0:

        continue

    

    print(i)

1

3

5



'1'부터 '5'까지의 정수로 이루어진 range 순서열에서 두 개의 정수를 조합(combination) 하여 합이 '5'인 경우만 프린트를 하게 해주는 코드를 for 반복문과 continue 반복 제어문을 사용해서 짜보았습니다. 


for 반복문 with continue 제어문

실행 결과 (result) 

# if i+j == 5 then print i, j combination

for i in range(1, 6):

    for j in range(i+1, 6):

        if i+j != 5:

            continue        


        print(i, '+', j, '=', i+j)

1 + 4 = 5

2 + 3 = 5



(3-2) break 반복 제어문


break 반복 제어문은 조건이 참(True)일 때 반복을 중단(break, stop) 시키는 역할을 합니다. 위의 continue 와는 정반대의 기능을 하는 것이지요. 


아래는 '1'부터 '6까지의 정수로 이루어진 range 수열을 순서대로 프린트를 반복하여 하되, 만약 '4'에 도달하면 중단(break)하라는 간단한 반복문 예제입니다. 


for 반복문 with break 제어문

실행 결과 (result) 

for i in range(1, 6):

    print(i)

    

    if i == 4:

        break

1

2

3

4



위의 (3-1)의 두번째 예제에서 continue 를 사용해서 '1~5' 사이의 두 개의 정수의 합이 '5'인 조합을 프린트했었는데요, 이번에는 break 제어문을 사용해서 똑같은 결과를 출력해보겠습니다. (print(i, '+', j, '=', i+j) 함수의 위치가 위의 continue를 사용했을 때와 break 를 사용했을 때 다릅니다.)


 for 반복문 with break 제어문

실행 결과 (result)

for i in range(1, 6):

    for j in range(i+1, 6):

        if i+j == 5:

            print(i, '+', j, '=', i+j)

            break

1 + 4 = 5

2 + 3 = 5



(3-3) for 반복문에 if, else 조건문과 break 반복 제어문 사용


아래 예제는 break 반복 제어문을 사용해서 '3~20'까지의 정수 중에서 '1'과 자기 자신 외에는 나누어지지 않는 정수인 소수(prime number) 를 찾아내는 프로그램 코드입니다. for 반복문, if, else 조건문, break 반복 제어문이 복합적으로 사용된, 좀 복잡한 코드입니다만, 지난번 포스팅과 이번 포스팅을 찬찬히 살펴보고 여기까지 따라오신 분이라면 충분히 이해하실 수 있을 것이라고 생각합니다. 


for 반복문 with break, if, else

실행 결과 (result) 

for i in range(3, 21):

    for j in range(2, i):

        if i%j == 0:

            k = i/j

            print('%d is %d * %d' %(i, j, k))

            break # to move to the next number

        else:

            print(i, ' is prime')

            break


print('The end')

3  is prime

4 is 2 * 2

5  is prime

6 is 2 * 3

7  is prime

8 is 2 * 4

9  is prime

10 is 2 * 5

11  is prime

12 is 2 * 6

13  is prime

14 is 2 * 7

15  is prime

16 is 2 * 8

17  is prime

18 is 2 * 9

19  is prime

20 is 2 * 10

The end



(3-4) nested while 반복문에 if 조건문과 break 반복 제어문 사용


nested while 반복문에 if 와 break를 사용해서 위의 (3-3)에서 했던 결과와 동일한 '3~20 사이의 소수 찾기' 를 해보겠습니다. 아래 코드는 tutorialspoint 에서 참고한 것인데요, 이해하기가 좀 어렵네요. ^^; 


nested while loops with break, if

실행 결과 (result) 

i = 3

while(i < 21):

    j = 2

    while(j <= (i/j)):

        if not(i%j): 

            print('%d is %d * %d' %(i, j, i/j))

            break

        

        j = j + 1

        

    if (j > i/j):

        print(i, " is prime")

        

    i = i + 1

    

print('The end')


# True or False?

# not(4%2) # True

# not(3%2) # False

3  is prime

4 is 2 * 2

5  is prime

6 is 2 * 3

7  is prime

8 is 2 * 4

9 is 3 * 3

10 is 2 * 5

11  is prime

12 is 2 * 6

13  is prime

14 is 2 * 7

15 is 3 * 5

16 is 2 * 8

17  is prime

18 is 2 * 9

19  is prime

20 is 2 * 10

The end


많은 도움이 되었기를 바랍니다. 


이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요.



저작자 표시 비영리 변경 금지
신고
Posted by R Friend R_Friend

집에서 GPU를 탑재한 PC로 본격적으로 딥러닝 공부하고 싶은 분들이라면 


- 어느 정도 사양으로 PC를 구성해야 하나? 


- 가격대는 어느정도 되나? 


궁금하실 것 같습니다.  


저도 궁금해서 구글링도 하고, 주변에 지인 통해서 물어도 보면서 조사를 해보았었거든요. 


이번 포스팅에서는 제가 2주일 전에 집에서 딥러닝 공부하는데 사용하려고 장만한 PC 사양과 가격을 공유하고자 합니다.  사양 조사하고 견적받아서 비교해보는데 조금이나마 도움이 될 것 같습니다. 


와이프한테 재가(?)를 받은 예산 한도가 있어서 그래픽카드는 GTX 1070 DDR5 8GB로 했구요(예산이 넉넉하시면 GTX 1080 으로...), 가성비를 감안해 조립 PC로 장만했습니다.  


그동안 매번 노트북만 사용했고 데스크탑은 처음인데요, 데스크탑이 소음이 조금 있는거 빼면 가격대비 성능이 월등해서 아주 만족하고 있습니다. 






아래에 표로 사양이랑 가격을 표로 정리해보았습니다. (2017년 09월 01일 기준) 

가격은 시간이 지날 수록 내려갈 것이니 참고만 하시구요, 저는 11번가 에서 조립PC 업체 중에 한군데서 주문했는데요, 뽁뽁이로 칭칭 감아서 안전하게 빨리 배송 받았습니다.  


구분

제품명/ 스펙 

 가격 (단위: 원)

 가격 합

  데스크탑

  본체

 CPU : 인텔 7세대 카비레이크 i7 7700

 1,300,000 

 1,761,600 

(배송비 3,000 별도) 

 쿨러 : 잘만 CNPS80F 저소음 쿨러

 메인보드 : 기가바이트 B250M DS3H M-ATX

 메모리 : DDR4 16GB PC4 17000

 SSD : 120G SATA3

 그래픽 : AXLE GTX 1070 DDR5 8GB

 파워 : STROM 600LF 정격 600W V2.3

 케이스 : MK2 MAG 3.0 USB3.0

 게이밍 장 패드 (이벤트 선물)

 추가
 구성

 HDD 1TB 추가 (1개)

  59,900 

 RAM 16GB 추가 (1개)

138,000 

 삼성850 250G 변경 (1개)

67,900 

 LG DVD-RW (1개)

23,000 

 윈도우10+설치복구 (1개)

149,900 

 브리츠 BA-R9 스피커 (1개)

22,900 


GPU로 딥러닝 하는거 말고도요, VMware 깔아서 그 위에 우분투 설치하고, Ambari 설치한 후에, Ambari로 하둡 Eco 설치하기 위해서 SSD는 250GB로 했습니다.  


메모리도 최소 8GB 이상으로 하라고 권고하는데요, 저는 넉넉하게 32GB로 했습니다. 


왠만한 것은 D 드라이브 1TB에 저장해서 쓰면 하드도 꽤 안정적으로, 넉넉하게 사용할 수 있을 것 같습니다. 


5년여 전의 회사에서 쓰던 서버급을 집에서 사용하는 호사를 누리다니, 정말 기분이 좋습니다. ^____^



Wifi 인터넷 사용하기 위해 USB무선랜카드 듀얼밴드 랜카드로 했습니다. 듀얼밴드라서 속도가 무척 빠르구요, USB 꽂기만 하면 알아서 드라이버도 설치되고, 사용하기 무척 편하네요. 


구분 

제품명/ 스펙 

가격 (단위 : 원) 

무선

랜카드

 IPTIME A2000UA-4dbi USB무선랜카드 

 듀얼밴드 랜카드 (1개)

  31,300 

(배송비 2,500 별도) 



모니터는 삼성 32인치 커브드 모니터를 메인으로 쓰고, 세로로 돌려서 쓸 수 있는 델 24인치 모니터를 보조로 사용하고 있습니다. 델 24인치 모니터가 베젤도 얇고, 세로로 길게 쓸 수 있어서 긴 코드 참고해서 보면서 쓰기에 아주 좋습니다. 삼성 모니터는 기사님께서 배송 & 설치해주셔서 편했구요, 델 모니터는 택배로 온거 제가 설치했는데요, 설명서 보고 따라하면 아주 쉬웠습니다. 


키보드는 회사에서 쓰고 있는 MS거 인체공학 키보드로 집에서 쓸거 하나 더 장만했습니다. 'ㅎ'이랑 'ㅠ'의 자판 위치가 일반 키보다랑은 사용하는 손가락이 달라서 처음에 좀 익숙해지는데 시간이 필요한데요, 확실히 인체공학적이라 이 키보드 사용하고나서 부터는 손목 시린거가 없어졌어요. 비싼게 흠이긴 해요. ^^;


구분 

제품 스펙

가격 (단위 : 원)

 모니터

 삼성 커브드 모니터[LC27F396FHKXKR] (1개)

 310,000 (배송 무료) 

 DELL U2417H 24인치 모니터 (1개)

264,000 (배송 무료) 

모니터

받침대 

 강화유리 모니터 받침대 (1개)

17,500 (배송 무료) 

 키보드

 MS스컬프트 인체공학 데스크탑 (1개)

125,800 (배송 무료) 



PC 장만하려고 준비하시는 분들에게 도움이 되었기를 바랍니다. 


이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. ^^



저작자 표시 비영리 변경 금지
신고
Posted by R Friend R_Friend

문자열이나 숫자를 특정 형식으로 길이를 지정해주면 데이터를 출력했을 때 깨끗하게 정리가 되어 보이기 때문에 가독성이 좋아집니다. 


혹은 데이터가 특정 형식(format)으로 DB에 이미 지정이 되어 있어서 데이터 간 병합이나 join을 하기 위해 특정 형식으로 데이터를 표준화 해주어야 할 경우가 있습니다. 


이번 포스팅에서는 {base} package의 sprintf() 함수를 사용해서 


 - (1) 문자열을 매개변수 width 길이로 만들고, 빈 자리는 '0'으로 채우기 : sprintf("%05d", var)


 - (2) 소수점 숫자(numeric)의 자리수를 지정해주기 : sprintf(".5f", var)


하는 방법에 대해서 알아보겠습니다. 


이번 포스팅의 함수 sprintf()는 데이터 전처리할 때 종종 사용하는 편이예요. 



 (1) 문자열을 특정 길이로 만들고, 빈 자리수만큼 '0'을 채우기 : sprintf("%05d", var)





1자리, 2자리, 3자리, 4자리를 가진 데이터를 가지고 예제로 사용할 간단한 DataFrame을 만들어보겠습니다. 



> # making a sample DataFrame

> df <- data.frame(var1 = c(1, 11, 111, 1111))

> df

  var1

1    1

2   11

3  111

4 1111

 




위의 예제 데이터셋을 가지고, 칼럼 var1의 데이터를 


- '1 자리수를 가진 문자열'로 만들되, '1자리수가 안되면 모자라는 자리수 만큼'0'으로 채우기'

- '2 자리수를 가진 문자열'로 만들되, '2자리수가 안되면 모자라는 자리수 만큼'0'으로 채우기'

- '3 자리수를 가진 문자열'로 만들되, '3자리수가 안되면 모자라는 자리수 만큼'0'으로 채우기'

- '4 자리수를 가진 문자열'로 만들되, '4자리수가 안되면 모자라는 자리수 만큼'0'으로 채우기'

- '5 자리수를 가진 문자열'로 만들되, '5자리수가 안되면 모자라는 자리수 만큼'0'으로 채우기'


를 해보겠습니다. 


만약 매개변수 자리수보다 데이터의 길이가 더 크다면 '0'이 채워지지는 않습니다.  아래의 예제의 결과를 View(df)로 해서 보면 원래의 변수 var1과 sprintf() 함수를 사용해서 만든 var1_01d 변수의 데이터 출력 형식이 다른 것을 알 수 있습니다. 


그리고 class 함수로 데이터 형식을 살펴보니 원래 변수 var1은 숫자형(numeric)이지만 sprintf() 함수로 만든 새로운 변수는 요인형(factor)의 문자열로 바뀌어 있음을 알 수 있습니다. 



> #-------------------------

> # (1) sprintf(%03d, var) : Format number as fixed width, with leading zeros

> df <- transform(df, 

+                 var1_01d = sprintf("%01d", var1), 

+                 var1_02d = sprintf("%02d", var1), 

+                 var1_03d = sprintf("%03d", var1), 

+                 var1_04d = sprintf("%04d", var1), 

+                 var1_05d = sprintf("%05d", var1))

> df

  var1 var1_01d var1_02d var1_03d var1_04d var1_05d

1    1        1       01      001     0001    00001

2   11       11       11      011     0011    00011

3  111      111      111      111     0111    00111

4 1111     1111     1111     1111     1111    01111



> View(df)



> sapply(df, class)

     var1  var1_01d  var1_02d  var1_03d  var1_04d  var1_05d

"numeric"  "factor"  "factor"  "factor"  "factor"  "factor"




 (2) 소수점 숫자(numeric)의 자리수를 지정해주기 : sprintf(".5f", var)


무리수인 자연상수 e의 소수점 10째 자리까지의 수를 대상으로 sprintf("%.5f", e) 함수를 사용해서 소수점의 자리수를 설정해보겠습니다. "%.숫자f"의 숫자 만큼 소수점을 표시해주는데요, 반올림을 해서 표시해줍니다. 아래의 예제를 보시면 금방 이해할 수 있을 것입니다. 



> #-------------------------

> # (3) sprintf("%.5f", x) : formatting decimal point, 

> e <- c(2.7182818284) # mathematical constant, the base of the natural logarithm

> sprintf("%.0f", e)

[1] "3"

> sprintf("%.1f", e)

[1] "2.7"

> sprintf("%.2f", e)

[1] "2.72"

> sprintf("%.3f", e)

[1] "2.718"

> sprintf("%.5f", e)

[1] "2.71828"

> sprintf("%.10f", e)

[1] "2.7182818284"

 




아래의 예시는 sprintf("%숫자.f, e)로 '숫자' 부분에 매개변수로 정수 부분의 자리수를 지정해주는 예시입니다. 소수점의 자리도 모두 포함해서 '숫자' 부분 매개변수만큼의 길이로 표시 형식을 맞추어줍니다. 



> e <- c(2.7182818284) # mathematical constant, the base of the natural logarithm

> sprintf("%1.1f", e)

[1] "2.7"

> sprintf("%2.1f", e)

[1] "2.7"

> sprintf("%3.1f", e)

[1] "2.7"

> sprintf("%5.1f", e)

[1] "  2.7"

> sprintf("%10.1f", e)

[1] "       2.7"

>  



많은 도움 되었기를 바랍니다. 

이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. ^^





저작자 표시 비영리 변경 금지
신고
Posted by R Friend R_Friend