오픈소스 R을 무료로 사용하다 보니 세상이 참 많이 바뀌었구나 실감하게 됩니다. 데이터 처리/분석과 관련된 정말 파워풀한 툴인데 이게 무료라니 믿기지가 않거든요.

 

그러면서 SAS나 SPSS 등의 상용 툴 업체들은 어찌될가 걱정이 되고 궁금하기도 합니다. 국내 직장 내에 SAS나 SPSS 사용자가 주류를 차지하고 있기 때문에, 또 이들이 새로운 언어 R을 배우려고 하기 보다는 기존에 이미 익숙한 SAS나 SPSS를 그대로 사용하려고 하는 관성이 작용할 것이기 때문에, 당분간은 SAS나 SPSS가 시장점유율을 유지할 것으로 보이기는 합니다. 하지만 이게 5년, 10년간 계속될지는 의문입니다. 요즘 빅데이터 바람과 함께 R 바람도 거세거든요. 해외에서는 이미 R 사용자가 굉장히 많은 듯 하고, 국내에서도 주변에 R 사용자들이 보이고 있으니 서서히, 가랑비에 옷 젖듯 국내의 직장 내, 학계 내에서도 변화의 바람이 일지 않을 까 싶습니다. 이미 SAS나 SPSS 가 R과의 인터페이스를 자사 솔루션에 탑재했다는 것이 그 증거라고 볼 수도 있을것 같습니다.

 

MOOC (Mass Open Online Course)라고 해서, 온라인을 통해서 전세계의 사용자가 모여서 무료로 강의를 듣을 수 있는 공개 교육을 아는지요? 강사가 보면 스탠포드, MIT, 존스홉킨스 등 특출납니다. 그런데 이게 무료입니다. (본인 인증 자격증을 따려면 일부 유료 강좌도 존재). 

 

coursera, edx, udacity, Khan Academy, canvas 등이 있으니 한번 검색해서 들어가보시기 바랍니다. 강의 주제가 정말 다양하며, 최신의 학술적성과를 자랑하는 주제가 즐비합니다.

 

[ 화면 출처: www.coursera.org 홈페이지 화면 캡쳐 ]

 

MOOC를 보면서 앞으로는 '굳이 대학교 가야하나?'라는 생각을 하는 날이 오지 않을까 싶기도 합니다. MOOC로 못하는 인적네트워크 쌓기라든지 학교의 졸업장 등의 니즈로 인해 대학교가 아예 없어지지는 않겠지만... 예전과는 위상이 많이 달라질거 같다는 예상은 듭니다.  대학교 이사장들, 총장들, 대학교수들은 MOOC 를 보면서 어떤 생각을 하고 있을지 궁금합니다. 

 

아직은 한글로 된 강좌는 없고 대부분이 영어, 일부 중국어 강좌가 있습니다. 영어라는 언어가 한국인 입장에서는 진입장벽이 될 수도 있겠음니다만, 한글 자막 작업이 꾸준히 진행되고 있어서 이 또한 해결의 기미가 보입니다. 지식의 수명이 점점 짧아지고, 이제는 '평생교육'의 시대인데 MOOC는 이제 오픈소스 프로그램과 함께 세상의 변화를 알리는 선봉장 중의 하나라고 생각합니다.

 

R 툴을 노트북에 무료로 깔아서 한국의 안방에서도 존스 홉킨스 교수의 R 교육을 coursera에서 들을 수 있는 시대, 정말 꿈만 같습니다. R 오픈소스 무료 통계툴(수단), MOOC 무료 온라인 강의(지식)가 세상을 좀더 평등하게 만들어주는데 기여를 하지 않을까 기대를 해봅니다.  툴/수단과 지식을 획득하는데 필요한 비용을 획기적으로 낮추어서 '지식노동자'가 이전보다는 쉽게 나올 수 있는 환경이 갖추어졌기 때문입니다. 

 

 

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. 반갑네요 2016.04.05 07:32  댓글주소  수정/삭제  댓글쓰기

    지금 r을 활용한 통계분석 배우고있는데 많은 도움이 될 것 같군요 포스팅 감사합니다

지난 포스팅에서

 

- R 데이터 객체를 외부 파일로 내보내서 저장하기 write.table()

 

- R 분석 결과를 외부 파일로 내보내서 저장하기 cat()

 

을 알아보았습니다.

 

 

 R 분석 결과 외부 파일로 저장하기 : capture.output()

 

이번 포스팅에서는 R 분석 결과 외부 파일로 저장하기 : capture.output()에 대해서 알아보도록 하겠습니다. 분석 결과를 외부로 내보내서 저장하는 cat()과 caputre.output()의 차이점은 cat()이 벡터를 다룬다면 capture.output()은 리스트를 다룬다는 점입니다.

 

아래 함수가

누구를 

어떤 데이터 구조를

무슨 일을 하는가? 

 wriite.table()

 데이터 객체

 데이터 프레임

(data frame)

 텍스트 파일로 외부 저장

 cat()  분석 결과  벡터 (vector)

 텍스트 파일로 외부 저장 

 capture.output()

 분석 결과  리스트 (list)   텍스트 파일로 외부 저장

 

 

capture.output() 함수를 아래 실습을 따라하면서 설명하도록 하겠습니다.

 

 

> ## 10명의 키, 몸무게로 데이터 프레임 만들기

> height <- c(175, 159, 166, 189, 171, 173, 179, 167, 182, 170)
> weight <- c(62, 55, 59, 75, 61, 64, 63, 65, 70, 60)
> d.f_h_w <- data.frame(height, weight)
> 

> ## 키와 몸무게 1차 선형 회귀모형 만들기

> lm_fit_h_w <- lm(weight ~ height, d.f_h_w)
> summary(lm_fit_h_w)
 

Call: lm(formula = weight ~ height, data = d.f_h_w) Residuals: Min 1Q Median 3Q Max -3.8614 -1.4780 -0.1812 1.1986 5.1787 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -38.1534 18.2437 -2.091 0.069874 . height 0.5867 0.1053 5.573 0.000527 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 2.727 on 8 degrees of freedom Multiple R-squared: 0.7952, Adjusted R-squared: 0.7696 F-statistic: 31.06 on 1 and 8 DF, p-value: 0.0005268

 

위에 만든 (1) 데이터 프레임과 (2) 회귀모형 적합 결과 summary(lm_fit_h_w) 를 텍스트 파일로 저장해보도록 하겠습니다.

 

  • "Dataset is as follows: " 문구 쓰고, lm_fit_h_w.txt 파일 생성

> cat( "Dataset is as follows; ",
+      "\n", 
+      "\n", 
+      file = "C:/Users/user/Documents/R/lm_fit_h_w.txt") 

 

 

 

  • lm_fit_h_w.txt 파일에 다가 lm_fit_h_w 데이터 프레임 데이터를 붙여서 저장하기 

> write.table(d.f_h_w, "C:/Users/user/Documents/R/lm_fit_h_w.txt", 
+             sep = ",", 
+             row.names = FALSE, 
+             quote = FALSE, 
+             append = TRUE)
Warning message:
In write.table(d.f_h_w, "C:/Users/user/Documents/R/lm_fit_h_w.txt",  :
  열의 이름들을 파일에 추가합니다 

 

 

 

  • "Summary of linear regression model is " 문구 삽입하기 

 

> cat( "Summary of linear regression model is ",
+      "\n", 
+      "\n", 
+      file = "C:/Users/user/Documents/R/lm_fit_h_w.txt", 
+      append = TRUE)

 

 

 

  • summary(lm_fit_h_w) 결과를 lm_fit_h_w.txt 파일에 붙여서 저장하기
    - cat() 함수를 쓰면 'list' 데이터 구조는 처리할 수 없다는 에러 메시지 발생

> cat( "\n", 
+      "\n", 
+      summary(lm_fit_h_w), 
+      file = "C:/Users/user/Documents/R/lm_fit_h_w.txt", 
+      append = TRUE)
Error in cat(list(...), file, sep, fill, labels, append) : 
  argument 3 (type 'list') cannot be handled by 'cat' 

 

 

               - 이때는 capture.output() 함수를 사용하면 됨

 

> capture.output(summary(lm_fit_h_w), 
+                file = "C:/Users/user/Documents/R/lm_fit_h_w.txt", 
+                append = TRUE) 

 

 

키와 몸무게의 1차 선형회귀모형의 summary() 결과가 텍스트 파일에 append 되어 저장되었음을 확인할 수 있습니다.

 

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

 

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. Jun 2015.12.21 18:43  댓글주소  수정/삭제  댓글쓰기

    1편부터 쭉 읽으며 따라하고 있습니다.
    최근 기존에 매틀랩과 엑셀을 사용해 데이터처리하다 한계를 느껴 새로운 툴을 찾아보고있었는데 너무 좋은 강좌 감사드립니다!!

  2. 2016.01.13 21:02  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • R Friend R_Friend 2016.01.13 23:55 신고  댓글주소  수정/삭제

      전지환 님, 아래처럼 lm() 함수를 이용해서 2줄 프로그램 입력하시면 됩니다.

      lm_fit_h_w <- lm(weight ~ height, d.f_h_w)
      summary(lm_fit_h_w)

      제가 블로그 포스팅할 때 위의 프로그램 2줄을 실수로 빼먹었었네요. ^^;
      최근에 선형대수 관련해서 연재하고 있는데요, 앞으로 5개 정도 더 선형대수 연재한 후에 회귀분석에 대해서 포스팅해보려고 합니다. 회귀분석이 예측에 아주 많이 활용이 되는 편이어서 중요한지라 자세히 풀어볼까 생각중입니다.

    • 2016.01.17 18:49  댓글주소  수정/삭제

      비밀댓글입니다

    • R Friend R_Friend 2016.01.17 22:28 신고  댓글주소  수정/삭제

      전지환님, 꾸준히 하시는 모습 보기좋습니다. 화이팅하시구요! ^^

  3. 함께멀리 2017.12.15 01:34  댓글주소  수정/삭제  댓글쓰기

    자꾸 문의 드려 죄송합니다.
    매일 1개 강의는 보자는 식으로, 퇴근후에 별도로 공부하고 있습니다.
    근데 짜꾸 error가 발생하면서, txt file 내에 data 저장이 안되네요 ㅜ.ㅜ 머가 문제일까요?

    > write.table(d.f_h_w,"c:/users/jujak/documents/r/ex/lm_fit_h_w.txt",
    + sep = ",",
    + row.names = FALSE,
    + quote = FALSE,
    + append = TRUE)
    Warning message:
    In write.table(d.f_h_w, "c:/users/jujak/documents/r/ex/lm_fit_h_w.txt", :
    열의 이름들을 파일에 추가합니다
    > capture.output(summary(lm_fit_h_w),
    + file = "c:users/jujak/documents/r/ex/lm_fit_h_w.txt",
    + append = TRUE)
    Error in file(file, if (append) "a" else "w") :
    cannot open the connection
    In addition: Warning message:
    In file(file, if (append) "a" else "w") :
    cannot open file 'c:users/jujak/documents/r/ex/lm_fit_h_w.txt': No such file or directory

    • R Friend R_Friend 2017.12.16 00:30 신고  댓글주소  수정/삭제

      안녕하세요.

      문의해주신 R Script의 경로에서 "c:users" 에서 'c:'와 'users' 사이에 '/'가 빠져서 그런것 같습니다. (No such file or directory 이라는 에러 메시지가 뜬 이유)

      (수정 전)
      file = "c:users/jujak/documents/r/ex/lm_fit_h_w.txt"

      => (수정 후) file = "c:/users/jujak/documents/r/ex/lm_fit_h_w.txt"

  4. 김진양 2018.07.25 23:52  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 항상 감사히 잘 보고 있습니다!
    뭐 하나 질문해도될까요?
    현재 for 구문을 이용해 여러개의 df를 생성하고, 하나의 엑셀 파일에 전부 집어넣고 싶은데
    마지막 df만 엑셀에 저장이되네요.
    혹시 어떤 부분이 잘못되었는지 여쭤봐도 괜찮을까요?
    수식은
    urlbase<-"https://search.shopping.naver.com/search/all.nhn?query="
    low<-c("에어팟","코카콜라","건전지","삼다수")
    low
    for( i in low){
    url<-paste(urlbase, i ,"&cat_id=&frm=NVSHATC",sep="")
    nv<-read_html(url, encoding = "UTF-8")
    st<-html_nodes(nv, '.mall_name')%>%html_text()
    st<-st[1:10]
    price3<-html_nodes(nv, '._lowPriceByMall')%>%html_nodes('.price')%>%html_text()
    price3<-gsub('최저가','',price3)
    price3<-price3[1:10]
    df<-data.frame(가게명=st, 가격=price3)
    df
    df<-rbind(df, data.frame(가게명=url, 가격="r"))
    print(df)
    write.xlsx(, file="D:/456.xlsx", col.names=TRUE)
    }
    if(df[1,1]=="위메프"){
    print("True")
    }else{
    write.xlsx(df, file="D:/789.xlsx", append=TRUE)
    }
    }

    입니다.

    • R Friend R_Friend 2018.07.27 01:01 신고  댓글주소  수정/삭제

      안녕하세요 김진양 님, 오늘 저녁 늦께까지 회사 밋업행사에서 발표하는게 있어서 이제서야 봤네요.

      코드를 직접 돌려보지는 못했구요, 눈으로 보고서 고쳐보면 좋겠다 싶은 2군데 수정한 코드를 아래에 붙여놓습니다.

      제가 내일 새벽에 차타고 나갔다가 토요일 저녁에야 집에 돌아오는데요, 그 사이에는 컴퓨터를 사용할 수 없습니다. 혹시 만약에 아래 코드가 작동을 안하는데 급하신거면 제 답글 기다리지 마시고 주위에 다른 분에 도움을 요청하셔야 할거 같습니다.

      urlbase<-"https://search.shopping.naver.com/search/all.nhn?query="
      low<-c("에어팟","코카콜라","건전지","삼다수")
      low

      # (1) make blank dataframe
      df_all <- data.frame()

      for( i in low){
      url<-paste(urlbase, i ,"&cat_id=&frm=NVSHATC",sep="")
      nv<-read_html(url, encoding = "UTF-8")
      st<-html_nodes(nv, '.mall_name')%>%html_text()
      st<-st[1:10]
      price3<-html_nodes(nv, '._lowPriceByMall')%>%html_nodes('.price')%>%html_text()
      price3<-gsub('최저가','',price3)
      price3<-price3[1:10]
      df<-data.frame(가게명=st, 가격=price3)

      # (2) adding append=TRUE option
      write.xlsx(df, file="D:/456.xlsx", col.names=TRUE, append=TRUE)

      df_all <- rbind(df, data.frame(가게명=url, 가격="r"))
      print(df)

      }

      # (3) used df_all
      if(df[1,1]=="위메프"){
      print("True")
      }else{
      write.xlsx(df_all, file="D:/789.xlsx")
      }

  5. 김진양 2018.07.29 00:17  댓글주소  수정/삭제  댓글쓰기

    안녕하세요! 알프렌드님 친절한 답변감사드립니다!!
    말씀해주신 수식대로 해보았더니, Error in .jcall(wb, "Lorg/apache/poi/ss/usermodel/Sheet;", "createSheet", :
    java.lang.IllegalArgumentException: The workbook already contains a sheet of this name
    라는 문구가 나오면서 되지가 않습니다.
    구글링 해본 결과, append 명령어가 새로운 Sheet에 저장한다는 것 같은데, 그와 관련한 문제인 것 같습니다! 저는 원래 하나의 시트에 모두 나오게 하려고 했는데 그렇게는 안되는걸까요?
    질문이 꼬리에 꼬리를 물고 나와서 죄송합니다. 크롤링까지는 어떻게 꾸역꾸역 해보았는데 여기서 막히네요.... 친절한답변감사합니다^^

    • R Friend R_Friend 2018.07.30 13:14 신고  댓글주소  수정/삭제

      안녕하세요 김진양님,
      아래 코드 참고하시기 바랍니다.
      (폴더 안에 기존에 만들어놓은 456.xlsx, 789.xlsx 파일이 남아있으면 에러가 나니 미리 삭제하고 아래 코드를 실행하시기 바랍니다)

      # clear all
      rm(list=ls())

      # install and load libries
      install.packages("textreadr")
      install.packages("rvest")
      install.packages("xlsx")

      library(textreadr)
      library(rvest)
      library(xlsx)

      urlbase<-"https://search.shopping.naver.com/search/all.nhn?query="
      low <- c("에어팟","코카콜라","건전지","삼다수")
      low

      # for loop statement
      for (i in low){
      url <- paste(urlbase, i ,"&cat_id=&frm=NVSHATC",sep="")
      nv <- read_html(url, encoding = "UTF-8")
      st <- html_nodes(nv, '.mall_name')%>%html_text()
      st <- st[1:10]
      price3 <- html_nodes(nv, '._lowPriceByMall') %>% html_nodes('.price') %>% html_text()
      price3 <- gsub('최저가','',price3)
      price3 <- price3[1:10]
      df<-data.frame(가게명=st, 가격=price3)

      # append url to df
      df <- rbind(df, data.frame(가게명=url, 가격="r"))

      # adding sheetName
      write.xlsx(df, file="C:/Users/admin/Documents/456.xlsx",
      sheetName=i, # excel sheet per each product or brand
      col.names=TRUE,
      append=TRUE)

      # if else condition statement
      if(df[1,1]=="위메프"){
      print("위메프 True")
      } else {
      write.xlsx(df, file="C:/Users/admin/Documents/789.xlsx",
      sheetName=i,
      col.names=TRUE,
      append=TRUE)
      }

      # check progress
      print(paste0(i, " has been completed."))
      }

    • 김진양 2018.07.30 21:58  댓글주소  수정/삭제

      R프렌드님 감사합니다! 드디어 해결했습니다^^
      R프렌드님이 주신 코드를 단순히 copy & paste하는 것이 아니라, 찬찬히 하나하나 공부해보았습니다.
      제 실수는 write.xlsx과정에서 sheet를 추가하려한다면 write.xlsx(~~,~~, sheetname=i)로 설정하지 않은 것임을 깨달을 수 있었습니다.
      진심으로 감사의 말씀을 드립니다^^

      혹여나 실례가 되지 않는다면, for반복문에서 도출되는 데이터셋을 sheet별이 아닌, 하나의 sheet에 순차적으로 나타내는 방법은 없는지 여쭤볼 수 있을까요?

      해당 사항을 해결하기 위해 일주일동안 구글링을 했는데 해결방법을 알지 못해, 부끄러움을 무릅쓰고 이렇게 댓글을 남겨봅니다.

      제가 이해를 잘 못하고, 여러번 알프렌드님을 귀찮게 해드렸는데도 친절하게 대답해주셔서 정말로 감사합니다! 이번 일을 계기로 알프렌드님과의 인연을 소중히 생각하고 오랫동안 간직해나가겠습니다^^ 감사합니다.

    • R Friend R_Friend 2018.07.30 22:45 신고  댓글주소  수정/삭제

      안녕하세요 김진양님,
      아래 코드 참고하시기 바랍니다.
      원하시는 결과이기 바래요.

      # clear all
      rm(list=ls())

      # install and load libries
      # install.packages("textreadr")
      # install.packages("rvest")
      # install.packages("xlsx")

      library(textreadr)
      library(rvest)
      library(xlsx)

      urlbase<-"https://search.shopping.naver.com/search/all.nhn?query="
      low <- c("에어팟","코카콜라","건전지","삼다수")
      low

      # making a blank DataFrame to store
      df_all <- data.frame()

      # for loop statement
      for (i in low){
      url <- paste(urlbase, i ,"&cat_id=&frm=NVSHATC",sep="")
      nv <- read_html(url, encoding = "UTF-8")
      st <- html_nodes(nv, '.mall_name')%>%html_text()
      st <- st[1:10]
      price3 <- html_nodes(nv, '._lowPriceByMall') %>% html_nodes('.price') %>% html_text()
      price3 <- gsub('최저가','',price3)
      price3 <- price3[1:10]
      df<-data.frame(item=i, 가게명=st, 가격=price3)

      # append url info to df_all
      df <- rbind(df, data.frame(item=i, 가게명=url, 가격="r"))

      # combining df to df_all one by one
      df_all <- rbind(df_all, df)

      # check progress
      print(paste0(i, " has been completed."))
      }

      # exporting df_all to excel
      write.xlsx(df_all,
      file="C:/Users/admin/Documents/df_all.xlsx",
      col.names=TRUE)

  6. 김진양 2018.08.02 08:15  댓글주소  수정/삭제  댓글쓰기

    알 프렌드님 안녕하세요^^ 일이 너무 바빠 프로구램을 돌려보질 못했습니다(프로그램 알은 집에서 취미로 공부하고있어서요) 출근길에 알프렌드님 블로그를 돌려 감사인사 전해드립니다.
    얼른 집에 가서 해보고 말씀드릴게요. 너무 설레네요 감사합니다^^

    • R Friend R_Friend 2018.08.02 10:44 신고  댓글주소  수정/삭제

      잘 되면 좋겠네요

    • 김진양 2018.08.05 12:19  댓글주소  수정/삭제

      알프렌드님 감사합니다!!! 원하던 결과물을 도출해냈습니다.
      df에 있어서 rbind를 통해 item명을 i로 잡고 하니 해결이 가능했네요!
      뒤늦게 해결해서 죄송합니다.
      한달여가량 계속 고민하면서 알프렌드님을 알게되고, 알프렌드님의 친절한 교육으로 인해 결국 원하던 결과물을 도출해낼 수 있었습니다.
      진심으로 감사드리며, 블로그 자주 놀러와서 더욱 더 공부하는 학생이 될게요^^

    • R Friend R_Friend 2018.08.05 12:20 신고  댓글주소  수정/삭제

      원하던 결과를 얻어서 다행입니다. ^^

  7. 이수진 2019.10.16 10:48  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 267개 데이터프레임을 for문으로 각각 회귀분석 돌리고 267개 결과들을 한꺼번에 엑셀파일에 넣으려고합니다. 혹시 방법이있을까요?
    최종 데이터는 df_max_split 입니다!
    [code]
    #logistic regression#

    require(readxl)

    #01#[데이터 불러오기]

    # 작업공간 설정하기(이곳에 엑셀 파일이 있다고 가정)
    setwd("C:/Users/DV-Sub02/Desktop/한주금속")

    # 작업공간에 있는 엑셀 파일의 목록을 저장
    fileNames = list.files(pattern="xlsx")

    # 엑셀 파일의 이름과 동일하게 데이터생성
    for(i in 1:length(fileNames)){
    data = read_excel(path=fileNames[i], sheet=1, col_names=TRUE)
    assign(x=fileNames[i], value=data)
    }

    # 엑셀 파일 합치기
    df_max <- rbind(`201805.xlsx`,`201806.xlsx`,`201807.xlsx`,`201808.xlsx`,`201809.xlsx`,`201810.xlsx`,`201811.xlsx`,`201812.xlsx`,`201901.xlsx`,`201902.xlsx`,`201903.xlsx`,`201904.xlsx`)


    # 전부 고려
    ## 라인x품명x금형명
    df_max$case <- paste(df_max $작업라인,df_max $품명,df_max $금형명)


    # 한가지 고려
    ## 라인
    #df_max_time_Defectiverate$case <- paste(df_max_time_Defectiverate$작업라인)
    ## 품명
    #df_max_time_Defectiverate$case <- paste(df_max_time_Defectiverate$품명)
    ## 금형명
    #df_max_time_Defectiverate$case <- paste(df_max_time_Defectiverate$금형명)

    # 두가지 고려
    ## 라인x품명
    #df_max_time_Defectiverate$case <- paste(df_max_time_Defectiverate$작업라인,df_max_time_Defectiverate$품명)
    ## 라인x금형명
    #df_max_time_Defectiverate$case <- paste(df_max_time_Defectiverate$작업라인,df_max_time_Defectiverate$금형명)
    ## 품명x금형명
    #df_max_time_Defectiverate$case <- paste(df_max_time_Defectiverate$품명,df_max_time_Defectiverate$금형명)

    #dim(df_max_time_Defectiverate)

    # 데이터 나누기
    df_max_split <- split(df_max,df_max$case)

    • R Friend R_Friend 2019.10.16 11:40 신고  댓글주소  수정/삭제

      안녕하세요.
      제가 직장인인데요, 이번주에 너무 바빠서 일요일 저녁에 잠깐 시간이 날거 같습니다. 혹시 급하신거면 제가 바로 도와드릴수 없습니다. 죄송합니다. ㅠ.ㅠ

  8. 이수진 2019.10.16 11:44  댓글주소  수정/삭제  댓글쓰기

    도움주실 수 있으면 언제든지 괜찮습니다! 그동안 혼자 연구해보고 있겠습니다 감사합니다^^

    • R Friend R_Friend 2019.10.16 11:45 신고  댓글주소  수정/삭제

      지금은 개별 회귀분석 결과를 개별 엑셀에 내려보낸 디음에, 나중에 합체려고 하시는건가봐요?

      이 포스팅의 댓글 란에 보시면 엑셀로 내보내는 코드 있는데요, 혹시 그거에 참고하실만한게 있으려나요?

  9. 이수진 2019.10.16 13:14  댓글주소  수정/삭제  댓글쓰기

    네 개별 회귀분석 결과를 개별 엑셀에 내보내거나 한번에 다 같이 내보내는 방법 살펴보고있어요
    댓글 참고해서 한번 해보겠습니다 ㅎㅎ

  10. tnwls2 2019.10.16 15:56  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 각 데이터별 회귀분석 결과들을 df_max_split_GLM_result이름으로 리스트 형태로 저장했습니다. 그런데 맨 마지막 코드에서 for문으로 capture.output을 사용하니까 첫번째 리스트인 df_max_split_GLM_result1만 리스트개수만큼 반복해서 메모장에 저장되었습니다.ㅠㅠ 혹시 코드만 보시고 어떤게 문제인지 여쭤봐도될까요? 자꾸 문의드려 죄송합니다 ㅠㅠ
    #logistic regression#

    require(readxl)

    #01#[데이터 불러오기]

    # 작업공간 설정하기(이곳에 엑셀 파일이 있다고 가정)
    setwd("C:/Users/DV-Sub02/Desktop/한주금속")

    # 작업공간에 있는 엑셀 파일의 목록을 저장
    fileNames = list.files(pattern="xlsx")

    # 엑셀 파일의 이름과 동일하게 데이터생성
    for(i in 1:length(fileNames)){
    data = read_excel(path=fileNames[i], sheet=1, col_names=TRUE)
    assign(x=fileNames[i], value=data)
    }

    # 엑셀 파일 합치기
    df_max <- rbind(`201805.xlsx`,`201806.xlsx`,`201807.xlsx`,`201808.xlsx`,`201809.xlsx`,`201810.xlsx`,`201811.xlsx`,`201812.xlsx`,`201901.xlsx`,`201902.xlsx`,`201903.xlsx`,`201904.xlsx`)


    # 전부 고려
    ## 라인x품명x금형명
    df_max$case <- paste(df_max $작업라인,df_max $품명,df_max $금형명)


    # 데이터 나누기
    df_max_split <- split(df_max,df_max$case)


    #GLM
    for (i in 1:length(df_max_split)) {
    assign(paste0("df_max_split_GLM_result", i),glm(df_max_split[[i]]$양품판정결과~df_max_split[[i]]$'전자교반 가동시간'+df_max_split[[i]]$'설비가동 CT'+df_max_split[[i]]$'제품생산 CT'+df_max_split[[i]]$저속구간속도+df_max_split[[i]]$가동보온로+df_max_split[[i]]$용탕량,data=df_max_split[[i]],family="binomial"))
    }


    cat("data is as follows:","\n","\n",file="C:/Users/DV-Sub02/Desktop/한주금속/glm.txt",append=TRUE)

    for (i in 1:length(df_max_split)) {
    capture.output(summary(df_max_split_GLM_result[[i]]),file="C:/Users/DV-Sub02/Desktop/한주금속/glm2.txt",append=TRUE)
    }

    • R Friend R_Friend 2019.10.16 16:17 신고  댓글주소  수정/삭제

      안녕하세요.
      코드만 보고 테스트는 못해봐서 틀릴수도 있는데요, GLM 부분을 수정해보실래요?

      # GLM
      df_max_split_GLM_result <- {}

      for (i in 1:length(df_max_split)) {
      df_max_split_GLM_result[[i]] <- glm(동일)
      }

  11. tnwls2 2019.10.16 16:25  댓글주소  수정/삭제  댓글쓰기

    저렇게 해서 결과는 나왔는데 결과들에 대한 summary가 리스트형태라서 데이터프레임처럼 저장이 안되네요..ㅠㅠ

지난 포스팅에서 외부 파일을 R로 불러오는 함수에 대해서 알아봤다면, 이번 포스팅에서는 거꾸로 R에서 처리한 데이터 객체를 외부 파일(텍스트)로 저장하는 함수와 분석결과를 외부 파일로 저장하는 함수에 대해서 알아보겠습니다. 

 

(엑셀로 내보내는 것은 유용할 거 같아 시도해봤는데요, rJAVA가 안깔린다면서 에러가 나네요 -,-;)

 

 


 

 (1) 데이터 객체를 텍스트 파일로 저장: write.table()


지난 포스팅에서 외부 파일에서 R로 불러왔던 'dataset_1' 데이터 프레임을 이번에는 거꾸로 'cust_profile.txt'라는 이름으로 밖으로 내보내서 저장을 해보도록 하겠습니다. 

 

> ## 데이터 객체를 외부 텍스트 파일로 저장: write.table()

> write.table(dataset_1, "C:/Users/user/Documents/R/cust_profile.txt", 

+             sep = ",", 

+             row.names = FALSE, 

+             quote = FALSE, 

+             append = TRUE, 

+             na = "NA"

+             ) 

 

  • write.table( 데이터셋 이름, 저장할 경로/저장할 파일 이름...) 순서로 쓰되, 경로에 구분자가 '\'가 아니라 R에서는 '/' 이므로 주의 요망
  • sep = "," 또는 " " 또는 ":" 등 데이터 구분자 입력.  tab 구분자는 sep = "\t"
  • row.names = FALSE 행 이름(번호)가 생략됨. key 값이 별도로 있으면 생략하고, 혹시 key 값을 관리하고 싶은면 TRUE로 옵션 설정
  • quote = FALSE 면 변수 이름, 행 이름에 인용부호(" ") 생략. 구분자(sep)를 따로 지정하면 굳이 인용부호 없어도 무방
  • append = TRUE 이면 나중에 추가로 동일 파일 이름으로 write.table()함수가 실행될 경우 기존 파일에 덮어쓰기를 하지 않고 계속 이어 붙이기를 함. 덮어쓰기를 하면 기존 파일이 다 날아가버리고 마지막 덮어쓴 이후의 데이터만 남게되어 대략 난감한 상황 발생할 것이므로 append = FALSE 옵션은 조심. 
  • na = "NA" : 결측값이 있으면 "NA"로 표기. na = "." 이면 결측값을 마침표(.)로 표기.


[R 데이터 객체를 외부 텍스트 파일로 저장하기 전]

 

[R 데이터 객체를 외부 텍스트 파일로 저장하기 후 (cust_profile.txt 파일 신규 생성)]


 


 

 (2) 분석 결과를 외부 파일로 저장: cat()


[ 1~10 숫자형 벡터 x를 외부 텍스트 파일로 저장 ]

> ## 1~10 숫자형 벡터 x 생성

> x <- c(1:10)

> mean_x <- mean(x)

> sd_x <- sd(x)

> z_x <- ((x-mean_x)/sd_x)


> ## cat() 함수

> cat( "Data is as follows:", "\n", 

+      x, "\n", 

+      file = "C:/Users/user/Documents/R/data_x.txt", 

+      append = TRUE)


  • 큰따옴표(" ") 안에 텍스트는 그래도 출력됨
  • "\n"은 새로운 줄로 바꾸라는 뜻 (키보드 엔터 치라는 뜻)
  • 벡터 x 를 입력했더니 아래 처럼 벡터 x가 출력되었음. 벡터 연산도 가능. 
  • file = "" 파일 저장 경로 & 파일 이름 지정
  • append = TRUE 동일 경로 & 파일 이름으로 계속 이어 붙이기 하고 싶을 때 사용



[ x의 평균값을 기존 텍스트 파일에 이어 붙여서 저장 ]

> cat( "Mean of x is", mean_x, "\n", 

+      file = "C:/Users/user/Documents/R/data_x.txt", 

+      append = TRUE) 





[ x의 표준편차를 기존 텍스트 파일에 이어 붙여서 저장 ]

> cat( "Standard Deviation of x is", sd_x, "\n", 

+      "\n", 

+      "\n", 

+      "Z score of x is", z_x, "\n", 

+      file = "C:/Users/user/Documents/R/data_x.txt", 

+      append = TRUE) 





양이 적거나, 한번 하고 말일이면 그냥 console 창 가서 눈으로 분석결과 보고서 직접 타이핑하거나, 아니면 블럭 설정해서 복사 > 붙여넣기 하면 됩니다. 다만, 양이 아주 많거나, 아니면 다수 동일 반복작업이 필요한 경우는 cat() 함수로 프로그래밍을 하는게 노가다를 줄이고 정신 건강에도 좋겠지요?! 알아두면 유용한 함수입니다. 


console에 나타나는 모형 적합 결과를 외부 파일로 저장할 때 사용하는 capture.output()은 다음번 포스팅에 소개하도록 하겠습니다. 

 

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


Posted by R Friend R_Friend

댓글을 달아 주세요

  1. 2016.07.17 22:25  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  2. 2016.07.26 15:34  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • R Friend R_Friend 2016.07.26 16:02 신고  댓글주소  수정/삭제

      cat() 함수는 "분석 결과나 텍스트"를 외부 파일로 저장할 때 씁니다.

      write.table은 "데이터프레임"을 외부 파일로 내보내서 저장할 때 사용합니다.

  3. 2016.10.04 15:03  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  4. 함께멀리 2017.12.14 00:34  댓글주소  수정/삭제  댓글쓰기

    정성스럽게 써주신 블로그 글을 보면서 혼자 R을 공부하고 있는 사람입니다. 감사합니다.
    data를 cat()함수를 통해서 아래와 같이 진행해 봤는데, 자꾸 error가 나면서 등록이 안됩니다.
    어디가 잘못된 것인지요??

    > cat ("data is as follow","/n",
    Error: unexpected '>' in ">"
    > x,"/n"
    Error: unexpected ',' in " x,"
    > file = "C:/Users/Jujak/Documents/R/ex/data_x.txt"

  5. 인사하는너구리 2018.08.17 11:29  댓글주소  수정/삭제  댓글쓰기

    R에 관심있어서 혼자 공부하는 학생인데 너무 잘보고있습니다. 감사해요!!!
    write.table 실행시 '열의 이름들을 파일에 추가합니다'라는 warning message가 뜨더라구요
    구글링 해보니 "col.name = FALSE" 추가해서 해결했습니다.
    저와 같은 증상 나타나시는 분들은 참고하셨습면 좋겠네요

    • R Friend R_Friend 2018.08.17 11:41 신고  댓글주소  수정/삭제

      안녕하세요 인사하는 너구리님,
      댓글 감사합니다. 안내해주신 부분을 포스팅 본문에 추가해서 다른 분들도 쉽게 볼수 있도록 공유하겠습니다. 좋은 정보 감사합니다.

  6. R Friend R_Friend 2018.09.12 16:03 신고  댓글주소  수정/삭제  댓글쓰기

    퇴근 후에 저녁때 살펴보고 답글 달께요.

  7. 안녕하세요 2018.09.27 15:08  댓글주소  수정/삭제  댓글쓰기

    write.table(dataset_1, "C:/Program Files/RStudio/R/cust_profile.txt",
    sep = "",
    row.names = FALSE,
    quote = FALSE,
    ppend = TRUE,
    na = "NA"
    )
    로 입력하였을때
    Error in write.table(dataset_1, "C:/Program Files/RStudio/R/cust_profile.txt", :
    unused argument (ppend = TRUE)
    라고 하면서 작동이 안 되는데 왜 그런지 알 수 있을까요?

  8. R Friend R_Friend 2018.09.27 15:12 신고  댓글주소  수정/삭제  댓글쓰기

    ppend 를 append 로 바꿔서 해보실래요?

R에서 데이터를 c() 함수로 직접 입력하는 방법은 지난 포스팅에서 알아보았습니다. 

 

이 외에도

 

(1) edit() 함수를 이용해 엑셀 처럼 그리드 창에 직접 입력하는 방법과,

 

(2) 외부에서 txt나 csv, 엑셀 파일 등을 직접 불러오는 방법도 있습니다. 



(1) R 데이터 편집기 edit() 


엑셀 처럼 생긴 데이터 편집기 창을 사용하려면 edit() 함수를 이용하며, 데이터 프레임 구조로 저장됩니다. 

비교적 소규모의 데이터를 입력하기에는 써볼만 하겠지만, 대용량 데이터를 입력해야 하는 거라면 좀 무리겠지요? 


## 데이터 입력창 edit() 

> d.f <- data.frame()  # 데이터 프레임을 먼저 생성해 주고 나서, 

> d.f <- edit(d.f)  # 데이터 편집기 창 불러오기



edit() 함수로 데이터 편집기를 호출하면 아래와 같은 창이 뜹니다. 



'var1', 'var2', ....  부분을 클릭하면 '변수 편집기' 창이 팝업되며, '변수명'과 '유형(numeric, character)'을 편집할 수 있습니다. 




2. 외부 파일 데이터 불러오기  read.table() 


다수의 변수에 대해 다수의 관찰값이 2차원 형태로 구성된 데이터 파일을 불러오는데 read.table() 함수를 사용합니다. 


아래와 같은 데이터셋이 있습니다.

 


dataset_1.txt




> ## 외부 데이터셋 파일 불러오기

> dataset_1 <- read.table("C:/Users/user/Documents/R/dataset_1.txt", 

+                         header = TRUE,  # 변수명

+                         sep = ",",  # 구분자

+                         stringsAsFactor = FALSE, # 문자형 데이터를 요인으로 인식할지 여부

+                         na.strings = ""  # 결측값 표시

+                         ) 


  • '#' 은 R이 인식하지 않으므로 '#' 기호를 활용해 데이터셋에 대한 부가적인 설명을 덧붙여 놓을 수 있음

  • 파일 경로 입력할때는 Windows 탐색기 경로 구분자 '\' 가 아니라 '/' 로 반대 방향임을 주의 

  • 구분자 sep에는 콤마 ",", 빈칸 " ", ":", tap (sep = "\t") 등이 있음

  • stringsAsFactor = TRUE 하면 문자형 데이터를 요인(factor)으로 인식함. 요인으로 불러오는게 맞는지 아닌지 확인 필요

  • na.strings = "", ".", "NA" 등이 있음

  • 'csv' 파일은 read.csv() 함수를 사용. read.table() 함수와 다른 점은, read.csv()함수는 sep="," 옵션이 필요 없다는 점과 파일명 끝이 "dataset_name.cvs"로 끝난다는 점. csv 파일이 'comma separated values'의 약자로서 콤마로 구분자가 되어 있기 때문임. 


RStudio 의 우측 상단 'Environment' 메뉴에 보면 'dataset_1' 데이터 프레임이 생겼음을 확인할 수 있으며, 이를 클릭 시 왼쪽 상단에 'dataset_1' 이름으로 데이터셋 보기 화면이 열린다. 




엑셀, SAS, SPSS, 인터넷 홈페이지에서 불러오는 패키지가 있기는 합니다만 비추천하므로 포스팅은 생략합니다. 

엑셀은 sheet가 나뉘어져 있을 수도 있고 매크로 등의 함수가 걸려있을 수도 있어서 오류 여지가 있기에 엑셀 파일을 R로 불러오기 하는 것은 비추천합니다. SAS나 SPSS 파일을 불러오는 패키지도 버전 오류 여지가 있기에 비추천합니다. 홈페이지 URL도 언제 어떻게 바뀔지, 언제 없어질지 모르므로 비추천합니다. 

(엑셀 파일 불러오기 참고 ☞ http://rfriend.tistory.com/313 )


그냥 맘편하게, 확실하고 정확하게, txt나 csv 파일로 내려서 파일 불러오기 read.table() 함수 사용하시는걸 추천합니다. 

 

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

 

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. 잘보고있습니다 2018.03.26 19:49  댓글주소  수정/삭제  댓글쓰기

    하나하나 따라가면서 공부하고 있습니다.
    좋은 글 정말 감사드립니다.

    한가지 궁금한 점이 있어 댓글 남깁니다.
    read.table을 쓰다가, 많은 양의 데이터를 불러오니
    계속 멈춰서 고생했는데
    read.csv로는 불러와지더라구요.
    저만 겪은 일인건지, 아니면..
    두 기능에 차이가 있어서 그런건지 여쭤봅니다.

    감사합니다!





    • R Friend R_Friend 2018.03.26 22:09 신고  댓글주소  수정/삭제

      안녕하세요.

      (1) read.table()을 가져다가 디폴트 옵션을 일부 다르게 적용해서 쓰는게 read.csv() 인 것으로 알고 있습니다. 다만 read.table() 의 경우 메모리 사용에 일부 문제가 있어서 다양한 변수를 가지고 있는 대용량 데이터에 대해서는 부적절하다는 설명이 있습니다. 아래는 도움말에 나오는 메모리 사용 관련 내용입니다.

      > ?read.table()

      [ Memory usage ]

      These functions can use a surprising amount of memory when reading large files. There is extensive discussion in the ‘R Data Import/Export’ manual, supplementing the notes here.
      Less memory will be used if colClasses is specified as one of the six atomic vector classes. This can be particularly so when reading a column that takes many distinct numeric values, as storing each distinct value as a character string can take up to 14 times as much memory as storing it as an integer.
      Using nrows, even as a mild over-estimate, will help memory usage.
      Using comment.char = "" will be appreciably faster than the read.table default.
      read.table is not the right tool for reading large matrices, especially those with many columns: it is designed to read data frames which may have columns of very different classes. Use scan instead for matrices.


      (2) 대용량 데이터를 빠르게 읽어들이는데는 data.table 패키지의 fread() 함수를 사용해보시기 바랍니다. 훨~씬 빠릅니다. 아래 링크 참고하세요.
      ==> http://rfriend.tistory.com/337


      (3) 물론 (회사나 학교에서 여건이 허락한다면...) 대용량 데이터를 하둡이나 MPP(Massively Parallel Processing) DB (예: Pivotal의 GPDB) 에서 일단 전처리를 한 후에 요약데이터나 샘플링 데이터를 R이나 Python으로 가져와서 분석하시는 것을 권장합니다. (<- 제가 회사에서 하는 방법)

  2. 잘보고있습니다 2018.03.27 17:50  댓글주소  수정/삭제  댓글쓰기

    정말 친절하십니다.
    도움이 많이 되었습니다.
    감사합니다!!


R에서 데이터의 일부분을 선택/선별하는 작업을 Indexing 한다고 합니다. 


R로 데이터 전처리, 분석을 하다보면 R Indexing을 부지기수로 사용하게 되니 R Indexing은 제대로 알고 넘어가야할 매우 중요한 부분입니다. 


특히, R에서는 벡터 Indexing 후 연산하는게 매우 큰 강점이고 유용한 기능이랍니다. 


R을 잘 몰랐을 때 남이 짜놓은 R 코드를 보면서 도무지 이해가 안되고 수수께끼 같았었는데요, 나중에 알고보니 Indexing을 사용한 것이었더라구요. Indexing, 모르면 어렵게 느껴져도 한번 알고 나면 참 쉬운 개념이고 파워풀한 기능이랍니다. 



 

 R Indexing (인덱싱), R 데이터 선택

 

Indexing은 대괄호 [ ] 를 사용합니다. 

바로 직전에 포스팅한 R 데이터 구조별로 Indexing 예를 차근차근 들어보도록 하겠습니다. 


(1) 벡터 (Vector) Indexing


벡터 Indexing 할 때 조건을 주는 방법이 한가지만 있는게 아니랍니다. 


> x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

> ## 벡터 x의 첫번째 구성요소 Indexing
> x[1]

[1] 1
>
> ## 벡터 x의 세번째 구성요소 Indexing

> x[3]

[1] 3

> ## 벡터 x의 세번째~일곱번째 구성요소 Indexing

> x[c(3:7)]

[1] 3 4 5 6 7
>
> ## 벡터 x의 세번째, 다섯번째, 일곱번째 구성요소 Indexing

> x[c(3, 5, 7)]

[1] 3 5 7

> ## 벡터 x에서 TRUE 있는 위치의 구성요소 Indexing

> x[c(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE)]

[1] 1 2 3 



(2) 행렬(Matrix) Indexing


행렬 Indexing은 대괄호 [i, j] 를 사용합니다. (i번째 행, j 번째 열을 뜻함)


> ## 1~12 숫자로 4열짜리 행렬 생성
> m1 <- matrix(1:12, nrow=4)

> m1

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

[1,]    1    5    9

[2,]    2    6   10

[3,]    3    7   11

[4,]    4    8   12


> ## m1 행렬에서 4번째 행, 2번째 열 구성요소 선택 (i, j indexing)

> m1[ 4, 2 ]

[1] 8

> ## m1 행렬에서 4번째 행 전체 구성요소 선택 (i indexing)

> m1[ 4, ]

[1]  4  8 12

> ## m1 행렬에서 2번째 열 전체 구성요소 선택 (j indexing)

> m1[ ,2 ]

[1] 5 6 7 8

> ## m1 행렬에서 3번째과 4번째 행의 2번째 열 구성요소 선택 (i, j indexing)

> m1[ c(3,4), 2 ]

[1] 7 8 



(3) 배열(Array) Indexing


배열은 동일한 유형의 2차원 이상의 데이터 구조로서, 행*열이 있는 바구니를 층층이 쌓아 놓은 모양이라고 했었지요. 층이 있다보니 Indexing할 때도 대괄호 [i, j, k] 로서 [행, 열, 층] indexing 위치를 표시합니다. 


> ## 1~24까지의 숫자를 가지고 2행*3열짜리 행렬을 4개 층으로 만들기
> a1 <- array(1:24, c(2,3,4))

> a1

, , 1


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

[1,]    1    3    5

[2,]    2    4    6


, , 2


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

[1,]    7    9   11

[2,]    8   10   12


, , 3


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

[1,]   13   15   17

[2,]   14   16   18


, , 4


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

[1,]   19   21   23

[2,]   20   22   24


> ## a1 배열의 2번째 행, 3번째 열, 4번째 층에 있는 구성요소 선택 (i, j, k indexing)

> a1[2,3,4]

[1] 24

> ## a1 배열의 1번째와 2번째 행, 3번째 열, 4번째 층에 있는 구성요소들 선택 (i, j, k indexing)

> a1[c(1,2), 3, 4]

[1] 23 24



(4) 데이터 프레임(Data Frame) Indexing


대괄호 [i, j] 로 표시, [i번째 행, j번째 열] indexing해오라는 뜻입니다. 

통계 분석 시 데이터 프레임 구조를 가장 많이 사용하다고 했으므로 데이터 프레임 Indexing도 많이 사용하겠지요? 

대골호를 하나만 쓰느냐 ([]), 두개를 쓰느냐 ([[]])에 따라서 indexing후의 데이터 구조(벡터 또는 데이터 프레임)가 달라지므로 주의를 요합니다. 벡터 구조로 indexing할 때 'dataset이름$변수이름' 형식으로 '$'를 쓰기도 합니다. 아래 예제를 보면 이해가 쉬울 것입니다. 


> ## dataframe 생성

> d1 <- c(1,2,3,4)

> d2 <- c("Kim", "Lee", "Choi", "Park")

> d3 <- data.frame(cust_id = d1, last_name = d2)

> d3

  cust_id last_name

1       1       Kim

2       2       Lee

3       3      Choi

4       4      Park


> ## d3 데이터 프레임에서 첫번째 행의 모든 구성요소를 선택 [i, ] => 데이터 프레임으로 출력됨

> d3[1, ]

  cust_id last_name

1       1       Kim

> ## d3 데이터 프레임에서 두번째 열의 모든 구성요소를 선택[ ,j] => 벡터로 출력됨

> d3[ ,2]

[1] Kim  Lee  Choi Park

Levels: Choi Kim Lee Park

> ## d3 데이터 프레임에서 첫번째 행, 두번째 열의 위치에 있는 구성요소 선택 [i,j] => 벡터로 출력됨

> d3[1,2]

[1] Kim

Levels: Choi Kim Lee Park

> ## d3 데이터 프레임에서 1번째 열(변수) 구성요소 선택 [j] => 데이터 프레임으로 출력됨

> d3[1]

  cust_id

1       1

2       2

3       3

4       4

> ## d3 데이터 프레임에서 "cust_id" 변수의 구성요소 선택 ["var_name"] => 데이터 프레임으로 출력됨

> d3["cust_id"]

  cust_id

1       1

2       2

3       3

4       4

> ## d3 데이터 프레임에서 1번째 열(변수) 구성요소 선택 [[j]] => 벡터로 출력됨

> d3[[1]]

[1] 1 2 3 4

> ## d3 데이터 프레임에서 "cust_id" 변수의 구성요소 선택 $ => 벡터로 출력됨

> d3$cust_id

[1] 1 2 3 4

> ## d3 데이터 프레임에서 3번째 & 4번째 행, 2번째 열의 구성요소 선택 [c(i,i), j] => 벡터로 출력됨

> d3[c(3,4),2]

[1] Choi Park

Levels: Choi Kim Lee Park

>  



(5) 리스트 (List) Indexing


리스트 Indexing은 겹대괄호 [[i]] 를 사용합니다. (i 번째 층을 선택)

통계 분석 결과가 리스트 데이터 구조로 많이 출력된다고 했는데요, 분석 결과 중에서 특정 통계량만 선택(indexing)해서 다른 분석의 input으로 넣는 경우에 indexing 이 유용하게 사용됩니다. 


> ## L1, L2, L3, L4 각 구조가 다른 4개의 객체로 L5라는 list (묶음 다발) 만들기

> L1 <- c(1, 2, 3, 4) # Vector

> L2 <- matrix(1:6, 3, byrow=TRUE) # Matrix

> L3 <- array(1:24, c(3,4,2)) # Array

> L4 <- data.frame(cust_id = c(1, 2, 3, 4), last_name = c("Kim", "Lee", "Choi", "Park")) # Dataframe

> L5 <- list(L1, L2, L3, L4) # List

> L5   # L5 리스트 출력

[[1]]

[1] 1 2 3 4


[[2]]

     [,1] [,2]

[1,]    1    2

[2,]    3    4

[3,]    5    6


[[3]]

, , 1


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

[1,]    1    4    7   10

[2,]    2    5    8   11

[3,]    3    6    9   12


, , 2


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

[1,]   13   16   19   22

[2,]   14   17   20   23

[3,]   15   18   21   24



[[4]]

  cust_id last_name

1       1       Kim

2       2       Lee

3       3      Choi

4       4      Park



> ## L5 리스트의 2번째 구성요소(2번째 층) 선택 [[i]]

> L5[[2]]

     [,1] [,2]

[1,]    1    2

[2,]    3    4

[3,]    5    6

> ## L5 리스트의 2번째 구성요소(2번째 층)의 3번째 행, 1번째 열의 구성요소 선택 [[i]][j, k]

> ## => 부연설명하자면, 일단 L5[[2]] 로 2번째 층 객체 선택 후 => 여기서 다시 [3, 1]로 3번째 행, 1번째 열 구성요소 선택한다고 생각하면 되겠음

> L5[[2]][3,1]

[1] 5 


여기까지 차분히 읽어오셨다면 R Indexing 의 머나먼 길을 완주하신겁니다. R의 훌륭한 무기 하나 득템하신 것을 축하합니다! 

 

※ 주의

 

R의 색인(indexing)이 '1'부터 시작하는 반면에,

Java, C, C++, Python 은 순차 자료형의 색인이 '0'부터 시작합니다.

R 말고 다른 언어 쓰시는 분들은 좀 헷갈릴 수 있는데요, 주의하시기 바랍니다.

 

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

 

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. kjh 2016.08.20 10:51  댓글주소  수정/삭제  댓글쓰기

    좋은 글 감사합니다.
    중간에 따라서 해보다가 잘못된 것 같은 부분을 찾았는데요
    데이터프레임에서
    d3[1,] 결과물이 벡터라고 하셨는데
    class(d3[1,]) 해보면 data.frame이라고 나옵니다.
    d3[[1]] 값도 numeric(즉, 벡터)으로 나오구요..


  2. 2016.08.29 19:29  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  3. 2016.10.04 14:11  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  4. 문레기 2016.11.30 06:20  댓글주소  수정/삭제  댓글쓰기

    행렬만들때 굳이 nrow 안적어도 되네요

  5. wj 2017.03.23 11:10  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 R프로그램 검색하다가 좋은 블로그를 발견해서 댓글남깁니다.
    혹시 제 개인블로그(네이버블로그)에 요약정리하면서 공부하고 싶어서 그러는데
    혹시 출처를 밝히고 제 블로그에 글을 올려도 될까요?

  6. 망구 2017.08.01 19:00  댓글주소  수정/삭제  댓글쓰기

    포스팅으로 열심히 공부하고 있습니다!! 질문이 있는데요. 데이터 프레임에서 인덱싱 할때 데이터 프레임으로 나오고, 벡터로 나오는 경우에 어떤 차이점 때문에 그렇게 나오는 건가요??
    암기해야 하는 부분인가요?

    • R Friend R_Friend 2017.08.03 12:27 신고  댓글주소  수정/삭제

      안녕하세요 망구님.
      반갑습니다.

      DataFrame Indexing 할 때 반환객체가 어떤 때는 DataFrame이고 어떤 때는 vector 인지는 그냥 왜우셔야 할거 같습니다.

      어떤 때 vector로 반환되는지만 유심히 살펴보시면 편할거 같아요.

      - df[ , j]
      - df[i, j]
      - df[[j]]
      - df$var

      의 형식으로 DataFrame에서 indexing 할 때 vector를 반환합니다.

      이를 강제로 DataFrame으로 반환하고 싶으면
      data.frame(df[ ,j]) 처럼 data.frame() 함수를 사용하면 됩니다.

  7. 박수환 2018.08.06 03:28  댓글주소  수정/삭제  댓글쓰기

    아..인덱싱 정리도 완벽하십니다.
    정말 너무 감사합니다.
    제 R공부의 바이블입니다.
    사랑합니다.


SAS나 SPSS를 사용하다가 R을 처음 배우는 사용자라면 R에서 7개로 나누는 데이터 구조에 대해서 '이걸 왜 배우지? SAS나 SPSS는 이런거 모르고도 아무 문제 없이 데이터 처리, 분석 다 했었는데...'라는 의문과 함께, 'R 이거 배우기 어렵네...'라고 푸념할 수도 있겠습니다. 제가 그랬거든요. (SAS나 SPSS에서 주로 사용했던 데이터 구조가 R의 데이터 구조 중에서는 '데이터 프레임' or '행렬'이라고 하는 구조라고 생각하시면 됩니다. 전부다는 아니고 많은 경우....)


R의 데이터 구조별 특성에 대해서 정확하게 이해하지 않으면 나중에 데이터 처리, 분석 넘어갔을 때 자꾸 헷갈리고, 에러가 났을 때 에러 메시지가 무슨 의미인지 이해를 못할 가능성이 높습니다. 데이터 구조에 따라서 분석기법이 달라지게 되거든요. 라틴댄스로 치자면 빨리 '패턴' 배워서 멋지게 파트너와 춤추고 싶은데 선생님은 한달이고 두달이고 '스탭'만 연습시키는데요, 어찌보면 따분하고 답답한 '스탭' 기본기가 R로 치면 데이터 구조라고 생각하시면 되겠습니다. R의 기본이 되는 중요한 개념이므로, 그리고 나중에 이게 제대로 이해가 되고 R이 손에 익었다 싶을 때 다시 되돌아 보면 R에서 데이터 구조를 이렇게 나누어서 분석 기법을 달리 하는 것이 R의 차별화된 장점이자 특징이겠구나 하고 느끼게 되는 시점이 올겁니다. 


R 데이터 구조는 (1) 스칼라, (2) 벡터, (3) 요인, (4) 행렬, (5) 배열, (6) 데이터프레임, (7) 리스트의 7개로 나눌 수 있습니다. 하나씩 설명을 할텐데요, 처음에 잘 이해가 안가도 자꾸 R 사용하면서 다시 이번 포스팅 다시 돌아와서 한번씩 복습하시면 이해되는 날이 올거예요. (제가 Coursera로 강의 듣는데 R 데이터 구조라면서 강사가 막 영어로 뭐라 뭐라 하는데.... 뭔 소리인지 이해도 안되고, 이걸 왜 배우나 싶고, 짜증도 나고, 좌절도 되고...암튼 그랬는데요, 어느 순간 지나서 보니깐 다 이해를 하고 있더라고요. 한번 보고서 이해 안된다고 좌절하지 마시라는 뜻에서 자꾸 같은 소리 하고 있습니다. ^^;;;)



1. 스칼라 (Scala)


구성인자가 하나인 벡터를 말합니다. 


> # 스칼라 (Scala) : 구성인자가 1개인 벡터

> s1 <- c(1)

> s2 <- c("Kim") 



2. 벡터 (Vector)


벡터는 동일한 유형의 데이터가 구성인자가 1개 이상이면서 1차원으로 구성되어 있는 데이터 구조를 말합니다. 

(벡터 중에서 구성인자가 1개인 것을 '스칼라'라고 합니다)


> # Vector

> v1 <- c(1, 2, 3)                   # 숫자형 벡터

> v2 <- c("Kim", "Lee", "Choi")    # 문자형 벡터

> v3 <- c(TRUE, TRUE, FALSE)   # 논리형 벡터



3. 요인 (Factor) 


범주형(명목형 또는 순서형)의 데이터 구조를 요인(Factor)라고 합니다. 통계 분석 할 때 소위 '~~별' 분석을 할 때 쓰는게 요인이므로 굉장히 많이 사용됩니다. 나중에 분석을 하다보면 (1) '요인'으로 데이터를 변환해야 하는 경우도 생기고, (2) 반대로 '요인'이 아니어야 하는데 '요인'으로 데이터가 입력이 되어있어서 에러가 발생하는 경우도 생기곤 합니다. '요인'이 뭔지, 뭐에 쓰는 것인지 모르면 두 가지 경우 상황 파악을 못해서 곤혹스럽겠지요? 

요인이 가질 수 있는 값들을 '수준(level)'이라고 합니다. RDBMS에서의 '코드값'이라고 이해하면 되겠습니다. 수준(level)은 명목형은 상관없지만, 순서형의 경우 순서(order)를 부여할 수 있습니다. 분석 결과가 순서대로 범주화 되서 나와야 보기에 좋겠지요?


> # (1) 문자형 데이터를 그냥 입력하면, 따옴표가 있는 문자형 벡터가 생성

> f1 <- c("Middle", "Low", "High")

> f1

[1] "Middle" "Low"    "High"  

>

> # (2) factor()함수를 이용해서 문자형 벡터를 요인(factor)로 변환

> # 단, 순서를 지정 안해주면 알파벳 순서로 수준(level)이 자동으로 지정됨

> f2 <- factor(f1)

> f2

[1] Middle Low    High  

Levels: High Low Middle

>

> # (3) 수준(level)에 순서를 부여하려면 'order=TRUE' 옵션 설정, level=c("") 에 순서대로 입력

> f3 <- factor(f2, order = TRUE, level = c("Low", "Middle", "High"))

> f3

[1] Middle Low    High  

Levels: Low < Middle < High 



4. 행렬 (Matrix) 


행렬은 동일한 유형의 2차원 데이터 구조를 말합니다. (쉽게 말해 m x n 형태의 표 형태의 데이터)

참고로, 벡터는 동일한 유형의 1차원 데이터 구조라고 했지요. (쉽게 말해, 가로로 늘어선 한 줄 데이터)


행렬은 matrix() 라는 함수를 사용합니다. 

최적화(optimization) 할 때 제약조건을 행렬로 입력합니다. 공학에서 행렬 많이 사용합니다. 


> # 1~12까지의 숫자를 행(row)의 수가 4개인 행렬로 만들어라

> m1 <- matrix(1:12, nrow=4)

> m1

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

[1,]    1    5    9

[2,]    2    6   10

[3,]    3    7   11

[4,]    4    8   12

> # 1~12까지의 숫자를 행(row)의 수가 4개이고 행렬로 만드는데, 행 기준(byrow=TRUE)으로 채워나가라

> m2 <- matrix(1:12, nrow=4, byrow=TRUE)

> m2

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

[1,]    1    2    3

[2,]    4    5    6

[3,]    7    8    9

[4,]   10   11   12

>  



5. 배열 (Array) 


배열(Array)은 동일한 유형의 데이터가 2차원 이상으로 구성된 구조를 말합니다. 

참고로, 행렬은 동일한 유형의 2차원 데이터 구조라고 했지요. 따라서 배열은 쉽게 말해 행렬이라는 방을 층 층이 쌓아놓은 아파트라고 생각하시면 되겠습니다. 


> # 1~24까지의 숫자를 '2 x 3 행렬'로 해서 '4층' 짜리의 데이터 구조를 만들어라

> a1 <- array(1:24, c(2,3,4))

> a1

, , 1


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

[1,]    1    3    5

[2,]    2    4    6


, , 2


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

[1,]    7    9   11

[2,]    8   10   12


, , 3


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

[1,]   13   15   17

[2,]   14   16   18


, , 4


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

[1,]   19   21   23

[2,]   20   22   24 



> # 1~24까지의 숫자를 '3 x 4' 행렬로 해서 '2층'짜리의 데이터 구조를 만들어라

> a2 <- array(1:23, c(3,4,2))

> a2

, , 1


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

[1,]    1    4    7   10

[2,]    2    5    8   11

[3,]    3    6    9   12


, , 2


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

[1,]   13   16   19   22

[2,]   14   17   20   23

[3,]   15   18   21    1





6. 데이터 프레임 (Data Frame) 


데이터 프레임데이터 유형에 상관없이 2차원 형태의 데이터 구조를 말합니다. 

참고로, 행렬동일한 유형의 데이터가 2차원 형태로 구성되었다고 했지요. 

통계, 마이닝 분석할 때 데이터 프레임을 주로 사용합니다. 


> # 다른 유형의 벡터 생성

> d1 <- c(1,2,3,4)

> d2 <- c("Kim", "Lee", "Choi", "Park")

> # 데이터 프레임으로 묶기 : data.frame() 함수 사용

> d3 <- data.frame(cust_id = d1, last_name = d2)  # 변수명 부여

> d3

  cust_id last_name

1       1       Kim

2       2       Lee

3       3      Choi

4       4      Park 



7. 리스트 (List) 


리스트는 벡터, 행렬, 배열, 데이터 프레임 등과 같은 서로 다른 구조의 데이터를 모두 묶은 객체를 말합니다. 

참고로, 리스트 말고 나머지들은 서로 다른 구조의 데이터 끼리는 묶어 놓지 않았고 따로 따로 였지요. 

R에서는 통계 분석 결과가 보통 리스트 구조로 제시되고, 필요로 하는 통계량이 있으면 indexing해서 뽑아서 쓰기도 합니다. 

서로 다른 구조의 다수의 데이터 객체를 개별로 따로 따로 관리하는 것보다는, 이것들을 리스트라는 한 바구니에 가지런히 정리해서 모아놓으면 관리하기에 편하겠지요? 


> # Vector(L1), Matrix(L2), Array(L3), Data Frame(L4)를 만들어서, 하나의 List(L5)로 묶어라

> L1 <- c(1, 2, 3, 4) # Vector

> L2 <- matrix(1:6, 3, byrow=TRUE) # Matrix

> L3 <- array(1:24, c(3,4,2)) # Array

> L4 <- data.frame(cust_id = c(1, 2, 3, 4), last_name = c("Kim", "Lee", "Choi", "Park")) # Data Frame

> L5 <- list(L1, L2, L3, L4) # List

>

> # [[1]]는 Vector(L1), [[2]]는 Matrix(L2), [[3]]는 Array(L3), [[4]]는 Data Frame(L4)가 묶인 것임

> L5

[[1]]

[1] 1 2 3 4


[[2]]

     [,1] [,2]

[1,]    1    2

[2,]    3    4

[3,]    5    6


[[3]]

, , 1


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

[1,]    1    4    7   10

[2,]    2    5    8   11

[3,]    3    6    9   12


, , 2


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

[1,]   13   16   19   22

[2,]   14   17   20   23

[3,]   15   18   21   24



[[4]]

  cust_id last_name

1       1       Kim

2       2       Lee

3       3      Choi

4       4      Park

 


지금까지 살펴본 R의 데이터 구조를 도식화하면 아래와 같습니다. 뭐가 뭐의 부분집한인지, 각 데이터 구조를 구분하는 기준은 무엇인지 유심히 다시 한번 살펴보기 정리해보면 좋겠습니다. 



[ R 데이터 구조 (Data Structure in R) ]



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

 

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


Posted by R Friend R_Friend

댓글을 달아 주세요

  1. ㅇㅇㅇ 2016.12.13 08:47  댓글주소  수정/삭제  댓글쓰기

    흐 어렵지만.. 조금씩 배우면 할 수 있겠죠

  2. 온봄 2017.03.27 12:25  댓글주소  수정/삭제  댓글쓰기

    그간 R을 전혀 R지못해서, 조금씩 R아가고 있는데요~
    선생님이 차근차근 정리해주신 내용들이 참 많은 도움이 되고 있습니다 ^^ 이해하기 쉽게 친절히 정리해주셔서 고맙습니다.

  3. r뻔 2017.04.12 18:55  댓글주소  수정/삭제  댓글쓰기

    코세라하면서 멍하니 막막해 하고 있었는데 한 줄기 단비 같은 정리 입니다. 이렇게 고급진 메뉴얼에 너무 감사드리고 앞으로도 많은 가르침 부탁 드립니다!!!!

  4. guest 2017.09.02 14:55  댓글주소  수정/삭제  댓글쓰기

    제가 지금까지 제가 설명 중에 가장 잘 정리되어있네요. 많이 도움받고 갑니다. 공부를 정말 열심히 하시나봐요.

  5. orange 2018.01.21 16:31  댓글주소  수정/삭제  댓글쓰기

    진짜 설명 기초부터 잘 해주셔서 많이 배우고 갑니다!!! 너무 감사드려요 ㅎㅎㅎ

  6. 감사합니다 2018.04.13 08:31  댓글주소  수정/삭제  댓글쓰기

    진짜 이렇게 깔끔한 순서와 친절한 설명이... 감사합니다!

  7. 감사합니다. 2018.04.15 22:12  댓글주소  수정/삭제  댓글쓰기

    감사합니다^^ 혹시 오프라인 강의도 하시나요?

  8. 박수환 2018.08.06 03:08  댓글주소  수정/삭제  댓글쓰기

    쌤, 진짜 막혀있던 혈이 풀리는 포스팅입니다 ㅜㅜ
    독학하다가 어딘가 알게 모르게 혼란에 빠지곤 했는데, 구조와 유형의 의미를 명확히 알게 되었습니다.
    이 포스팅은 정말 막힐때마다 와서 개념잡기용으로 다시 봐야겠어요.
    정말 감사합니다!!

데이터 구조 (스칼라, 벡터, 요인, 행렬, 배열, 데이터프레임, 리스트 등)에 대해서는 다음번 포스팅에서 소개하도록 하겠으며, 먼저 벡터를 가지고 R에서 객체를 입력하는 방법과 몇가지 Tip을 소개하고자 합니다. 



R 객체 입 (할당)


R 에서 객체를 입력(할당)할 때는 (1) '<-', (2) '=' 의 두가지 방법이 있습니다. 저는 처음에 '<-'로 coursera 교육을 받았었는데요, 이후 한글로 된 책에서는 '='로 되어 있더군요. 


둘 다 가능합니다만, '='는 일부 오류가 발생하는 경우가 있다고 하니 '<-' 를 추천합니다. 수식을 취해서 변수 변환을 해야 하는 경우 '==' 을 사용하는데요, 이와 혼돈이 될 수 도 있고 하니 '<-' 를 가급적 사용하는 것을 추천합니다. 


데이터 유형은 'a.숫자형(numeric)', 'b.문자형(character)', 'c.논리형(logical)' 의 3가지가 있는데요, 각 유형별로 벡터 입력(할당)을 해보도록 하겠습니다. 


객체를 '<- c()' 입력하게 되는데요, 이때 'c'는 'concatenate' 의 첫 알파벳으로서 '연결'이라는 뜻이 되겠습니다. 


'문자형' 객체 입력 시에는 큰 따옴표("")를 해주어야 합니다. 


'논리형' 객체는 'TRUE'는 '1'로, 'FALSE'는 '0'으로 컴퓨터가 인지를 합니다. 나중에 Indexing 이나 벡터 연산을 할 때 이러한 성질을 알고 있으면 개념을 이해하는데 도움이 될 것입니다. 


# 숫자형(numeric) 벡터 객체 입력

x <- c(1, 2, 3, 4, 5)


# 문자형(character) 벡터 객체 입력

y <- c("Kim", "Lee", "Lee", "Choi", "Park")


# 논리형(logical) 벡터 객체 입력

z <- c(TRUE, TRUE, FALSE, FALSE, TRUE)



RStudio 의 우측 상단의 Environment 탭에서 Values를 보면 아래 처럼 x: numeric 벡터, y: character 벡터, z: logical 벡터가 새로 생겼음을 확인할 수 있습니다. 





R Tips 


R 사용 상의 몇가지 Tip을 소개하자면, 


(1) '#' 기호는 인식하지 않습니다. 


따라서 부가설명을 달기에 유용하게 사용할 수 있습니다. 위의 R 실습 문에도 '#'으로 부가설명을 달아놓았음을 알 수 있습니다. 나중에 외부 데이터 파일 불러오기 함수에 대해서도 소개를 할텐데요, 외부 파일에 데이터셋에 대한 부가 설명을 '#'로 시작해서 달아놓으면 데이터셋을 처음 보는 사용자라도 이해하기에 많은 도움이 되겠지요. 



(2) '대문자'와 '소문자'를 구분합니다. 


> # 대문자와 소문자 벡터 할당 예시

> x <- c(1, 2, 3, 4, 5) # 소문자 x 벡터

> X <- c(1, 0, 1, 0, 1) # 대문자 X 벡터

> x

[1] 1 2 3 4 5

> X

[1] 1 0 1 0 1 



# 소문자x 벡터와 대문자 X 벡터의 평균 값이 각 각 다르게 나옴

> mean(x)

[1] 3

> mean(X)

[1] 0.6



# 대문자로 시작하는 'Mean()'이라는 함수는 찾을 수 없다는 에러메시지가 뜸. 

> Mean(x)

Error: could not find function "Mean"



(3) 객체 이름을 숫자나 숫자로 시작하는 이름으로 지정하면 안됨


> # 객체 이름을 숫자로 하면 에러 발생

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

Error in 3 <- c(1, 2, 3) : invalid (do_set) left-hand side to assignment
>
> # 객체 이름을 숫자로 시작해도 역시 에러 발생

> 3x <- c(1, 2, 3)

Error: unexpected symbol in "3x"
>
> 영어 알파벳 뒤에 숫자 쓰는 것은 괜찮음

> x3 <- c(1, 2, 3)

> x3

[1] 1 2 3

>
> # 한글 입력 예시 (1년 전만해도 한글 인식 못했던 것 같은데...되네요 ^^')
> 한글 <- c("김씨", "이씨", "이씨", "최씨", "박씨")

> 한글

[1] "김씨" "이씨" "이씨" "최씨" "박씨"



(4) R이 강력한 이유 중의 하나가 벡터 연산이 자유롭다는 것입니다. 

벡터끼리의 연산 예 중에서 재미있는 몇 개만 예를 들어보도록 하겠습니다. 벡터 연산이 안된다면 루프 프로그램을 따로 짜야 하는 경우가 생기는데요, R은 벡터 연산이 자유로우므로 프로그램이 한결 간결해질 수 있어서 좋습니다. 


> # 벡터를 가지고 새로운 벡터를 만들기, c(6:10)은 c(6,7,8,9,10)과 동일. 연속된 숫자 일괄 입력에 유용

> x <- c(1, 2, 3, 4, 5)

> x2 <- c(x, 6:10)

> x2

 [1]  1  2  3  4  5  6  7  8  9 10 

>

> # 논리형 벡터 TRUE 는 '1', FALSE는 '0'으로 인식함. 벡터끼리 연산 가능함

> z <- c(TRUE, TRUE, FALSE, FALSE, TRUE)

> x_plus_z <- c(x + z)

> x_plus_z

[1] 2 3 3 4 6

>

> # 요소 숫자가  x2는 10개, z는 5개로 서로 다름. 

> # 이럴 경우 개수가 작은 벡터의 요소가 순서대로 순환하면서 연산을 하게 됨.

> x2_plus_z <- c(x2 + z)

> x2_plus_z

 [1]  2  3  3  4  6  7  8  8  9 11

>  

>

> # 입력 요소의 유형이 서로 다를 경우 문자형으로 강제 변환되어 입력됨

> x3 <- c(1, "Kim", TRUE)  # 숫자형, 문자형, 논리형으로 입력했다고 생각하지만...

> x3

[1] "1"    "Kim"  "TRUE"    # 결과적으로 큰 따옴표가 붙어서 모두 문자형으로 입력되었음




맛뵈기로 벡터에 대해서 몇가지 Tip을 소개했는데요, 다음번 포스팅에서는 데이터 구조 (스칼라, 벡터, 요인, 행렬, 배열, 데이터프레임, 리스트 등)에 대해서 소개하도록 하지요. 

 

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

 

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. 문레기 2016.11.30 05:28  댓글주소  수정/삭제  댓글쓰기

    '<- c()'의 c가 함수였군요;; c 대신 아무거나 썼더니 안되네요

  2. 학습자 2016.12.30 00:17  댓글주소  수정/삭제  댓글쓰기

    완전 좋아요!
    감사합니다

  3. dondoni 2017.08.26 14:18  댓글주소  수정/삭제  댓글쓰기

    완벽한 r강의입니다!!
    열심히공부하겠습니다!!
    정말 감사드립니다 ㅠㅠㅠ

  4. 앤글 2018.08.28 10:59 신고  댓글주소  수정/삭제  댓글쓰기

    R 에서 객체를 입려(할당)할 때

    요기 부분에 오타가 있네요! 좋은 글 잘 봤습니다. 블로그 자주 참고할게요 ㅎㅎ

R은 무엇이고, 왜 R인가에 대해서 알아보았으므로 이제 직접 R을 다운로드해서 컴퓨터에 설치해보도록 하겠다. 

- 하둡 클러스터 설치하는 것마냥 복잡하고 어려운 것도 아니고 (다운로드, 몇번 클릭하다보면 설치 끝), 
- 상용 통계 툴처럼 다운로드 하는데 시간 올래걸리지도 않으며 (base 패키지 파일 사이즈 작음. 62Megabytes), 
- 사용자 등록을 하라는 메시지가 뜨지도 않는다. (오픈소스니깐)

아래의 절차에 따라 차근차근 따라서 진행해보도록 하자. 


1. CRAN(The Comprehensive R Archive Network, http://www.cran.r-project.org/)에 접속하기

CRAN 사이트에 접속하면 아래와 같은 화면이 보일 것이다. 

CRAN 사이트는 R 사용자라면 앞으로 자주 방문할 곳이므로 북마크를 해놓도록 하자. 수많은 패키지 검색, 다운로드, 매뉴얼, R 새로운 소식 등을 접할 수 있는 R의 허브이자 정보집합소이다. 


2. 해당 OS에 맞게 R 다운로드 하기 선택

Linix, (Mac) OS X, Windows 중에서 본인의 컴퓨터에 해당하는 OS를 선택하여 다운로드 하도록 한다. 
필자는 Windows 노트북을 사용하므로 'Download R for Windows'를 선택하였다. 


3. Subdirectories에서 'base'를 선택

분석/그래픽/프로그램 용도로 사용할 것이므로 base, contrib, Rtools 의 세개 카테고리 중에서 'base' 시스템을 선택하여 다운로드 하도록 한다. 

(참고로, R은 base 시스템을 먼저 설치하고(지금 이거 하고 있는 중임), (분석 기법별) 패키지를 이후에 하나씩 추가로 필요에 따라서 설치해서 사용하게 된다.)


(R패키지를 직접 개발할 고수라면 Rtools를 다운받으면 되겠다. 물론 그정도 고수라면 본 블로그를 들어오지 않았을테고... 이렇게 친절하게 알려주지 않아도 이미 알아서 자력갱생 하고 있을 것 같지만...^^')


4. 버전, OS 확인하고 다운로드 하기

필자는 Windows 사용 중이므로 'Download R 3.2.1 for Windows'를 클릭해서 다운로드 하였다. 

(참고로, R은 버전 upgrade가 활발하게 이루어지고 있는 편이고, 버전에 따라서 설치해둔 패키지가 안돌아가는 경우도 있고 해서 사용하다가 어느 정도 기간이 지나면 upgrade를 해주어야 하는 일이 생긴다.)



미러 사이트를 선택하라는 메시지가 나올텐데 'Korea' 3군데 중에서 한 곳을 선택해서 다운로드 하도록 하자. 


5. 다운로드한 R파일 클릭해서 설치 시작하기

독자의 컴퓨터의 '다운로드' 폴더에 가보면 'R-3.2.1-win' 이라는 방금전 다운로드 받은 프로그램 파일이 들어있을 것이다. 클릭해서 설치 시작하도록 하자. 



설치 언어 '한국어' 선택하고, 디폴트 상태 유지한 채로 '예(Yes)'만 계속 몇 번 클릭하다 보면 어느새 설치 끝난다. 



6. R 실행하기

컴퓨터바탕화면에 가보면 R 프로그램 아이콘이 새로 생긴 것을 확인할 수 있다. 
R i386 3.2.1 은 "32비트" 컴퓨터용의 R 3.2.1 버전이라는 뜻이고, R x64 3.2.1 은 "64비트" 컴퓨터용의 R 3.2.1 버전이라는 뜻이다. 
64비트로 처리하는 R x64 3.2.1이 처리속도 면에서 당연히 빠르겠지만, 본인의 컴퓨터가 이를 지원하도록 세팅이 되어있는지 확인하고 자신에게 해당하는 프로그램을 선택해서 쓰면 되겠다.
R이 메모리 기반으로 분석을 진행하다보니 대용량 데이터를 클라이언트PC에서 돌리다 보면 뻣어버리는 수가 있다. (이런 이유로 엄밀히 말하자면 R은 대용량 빅데이터 분석 툴이라고 하기에는 무리가 있다...) 그래서 필자는 5만원짜리 메모리 사서 추가하고 OS도 64비트용으로 새로 깔아서 R 쓰고 있다. 


7. R 실행화면

컴퓨터 바탕화면에 있는 R 아이콘 클릭했더니, 짜잔~
아래의 R 프로그램 화면이 뜬다면 설치 성공했다는 뜻이다. 
이제 분석을 해보고 싶어서 손이 근질근질해지지 않는가? ^^


R base 시스템이 상용 통계툴에 비하면 많이 허전하고 불친절하게 느껴질 듯하다. 그렇다고 실망하지는 말자. RStudio라고 해서 사용자 친화적인 R 통합 분석/개발 환경 툴이 있으니 말이다. 

패키지 설치해서 분석 들어가기 전에, 다음 포스팅에서는 R 통합 분석/개발 환경 툴인 RStudio 설치하기에 대해서 다루도록 하겠다.

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

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. JelicleLim 2017.05.06 23:24 신고  댓글주소  수정/삭제  댓글쓰기

    "RStudio 설치하기" 링크가 잘못되어 있습니다. admin 계정과 연결되어 있네요. ^^

  • R은 무엇인가? (What is R?)

 R이 무엇인지에 대해서 R 공식 사이트(http://www.r-project.org/)에서는 "R은 통계 분석과 그래픽을 위한 언어이자 환경이다(R is a language and environment for statistical computing and graphics.)"라고 정의하고 있다. 

 오픈소스 "통계 분석(statistical computing)" 툴이라고 많이 알고 있을 듯 한데, 이에 더해 "그래픽(graphics)", "언어(language)", "환경(environment)"이라는 말은 무슨 말이가 하고 관심이 갈 듯 하다. 

 특히 R 공식 사이트의 "About R" 메뉴(http://www.r-project.org/about.html)에서는 첨언하기를 "많은 사용자들이 R을 통계시스템이라고 생각지만, 우리는 R을 통계 기법이 실행되는 환경으로 생각해주기를 바란다 (Many users think of R as a statistics system. We prefer to think of it of an environment within which statistical techniques are implemented.)" 고 말하고 있다. 

 이는 R이 통계분석(statistical computing)과 그래프(graphics)가 파워풀하다는 점 외에도 "(프로그래밍) 언어(language)"이자 "(분석/개발) 환경 (environment)"로서 타 분석 툴과 차별화되는 강점이라고 말할 수 있겠다. 

 참고로 덧붙이자면, R은 오클랜드 대학교의 Robert Gentleman and Ross Ihaka에 의해서 처음 개발되었으며, 1997년 부터는 contributor들로 구성된 핵심 그룹에 의해서 소스코드가 관리되고 있고, 오픈GNU General Public License에 의거해서 무료로 사용할 수 있는 오픈소스 소프트웨어이다.  

 그럼, 자연스레 왜 R인가? R이 여타 분석 소프트웨어와 다른 점, 강점이 무엇인가로 넘어가보도록 하자. 


  • 왜 R인가? (Why R?)

 R을 통계 분석 위주로 사용해본 개인적인 경험에서 R이 좋은 점을 순서대로 적어보자면, 


1) 무료, 공짜, 0원 (free) 

오픈소스로서 무료이다 보니 원하는 사람, 기관, 기업이면 가져다가 바로 사용할 수 있다. 특히, 요즘 우리나라처럼 장기불황의 그림자에 짖눌려 기업에서 IT예산이 긴축 일변도인 상황에서는 무료라는 점이 그 어느때보다도 큰 매력으로 다가올 것 같다. 
(물론, "상용툴처럼 관리/지원해주는 정식 회사/조직이 없다"는 우려와 한계점이 있기도 하다) 

2) 안되는게 없는 분석 기능 (packages)

R에는 2015년 현재 4천개가 넘는 통계분석 패키지가 있다. 가장 최신의 분석기법이 상용 통계분석 툴에는 없더라고 R에는 있을 가능성이 높다. 오픈소스이다 보니 전세계의 분석가, 개발자들이 R의 프로그래밍 언어이자 개발환경이라는 장점을 활용해 분석 패키지, 자동화된 사용자 정의 함수를 만들어서 배포, 공유하는 생태계가 형성되어 있으며, 이를 통해 어느 상용 툴보다도 빠르게 또 광범위하게 분석 기능이 확장되고 고도화되고 있는 것이다. 
(물론, 이는 장점이면서 동시에 단점이기도 하다. 초보자가 4천여개의 패키지 중에서 자신에게 딱 맞는 패키지를 골라 쓰려면 대략 난감해질 가능성 또한 높다)


3) 강력한 그래프 기능 (graphics)

머리로 생각할 수 있는 거의 대부분의 그래프는 R로 프로그래밍해서 그릴 수 있다. 게다가 이쁘기까지 하다. R로 그래프를 그려서 바로 신문이나 책, 인터넷 포스팅에 사용해도 전혀 손색이 없을 정도로 완성도 높게 그래프가 그려진다. 엑셀에서는 불가능한, 다양한 데이터 조건을 줘서 그래프를 그리는 것도 가능하다. 시각화가 분석에서 가지는 중요성을 생각해본다면 통계 전문가가 아니어서 다양한 분석 패키지를 쓸 일이 없는 사용자라 하더라도 R의 강력한 그래프 기능 하나만 가지고도 R을 공부하고 사용할만한 충분한 값어치가 있다고 생각한다. 블로그 포스팅 하면서 R의 시각화, 그래프 기능에 대해서 자세하고도 집요하게 소개를 해보고 싶은 욕심이 있다. 

(물론, 다양한 옵션에 '헐, 어렵다'고 지레 겁먹을 수도 있겠다. '강력한 기능/다양한 옵션 = 어렵게 느껴질 수 있는 함정'이라고나 할까...)


4) 데이터 처리도 거뜬 (data manipulation)

데이터 분석을 하다보면 데이터 수집/처리/탐색적분석이 투입 공수의 60~80%를 차지하고 모델링은 상대적으로 적은 시간이 소요된다. 데이터를 떡 주무르듯이 자유자재로 다룰 수 있어야지 '데이터 분석 좀 하네'라는 소리를 들을 수 있을텐데, R은 데이터 처리에 있어서도 매우 강력한 툴이다. 

(물론, 기존 상용 통계분석툴의 사용자라면 R이라는 새로운 언어를 배우고 익히는데 처음에는 애를 좀 먹을 것이다. R 처음 배울 때 나오는 스칼라, 벡터, 요인, 행렬, 데이터프레임, 리스트 등.... 을 접하고는 '엥? 이것들이 다 뭐지? 뭐에 쓰는 용어지?'.... 기존 툴하고는 달라서 힘들 수는 있겠다.)


5) 객체 지향 프로그래밍 언어 (object-oriented programming language)

일회성 분석하고 끝낼게 아니라면, 시스템화/자동화를 해야하는 상황이라면, 개발자라면 '객체 지향 프로그래밍 언어'라는 말이 가지는 힘, 의미를 잘 알 것이라고 생각한다. R은 벡터 연산과 Indexing이 정말 유용하고 강력하며, 사용자 정의 함수와 루프 돌리는 프로그래밍 언어 또한 강력하고, 지도 등의 애플리케이션과도 연동이 되는데, 거기에 통계분석까지 된다. 구글이 회사차원에서 R을 사용한다고 하는데, 아마 이런 이유들 때문에 상용 통계 툴이 아니라 R을 사용하는게 아닌가 싶다. 

(물론, 분석 위주로 업무를 보는 분, 분석 관련 전공하신 분들은 프로그래밍, 개발 얘기하면 이게 무슨 소리인가 하고 잘 이해가 안갈 수도 있겠으나, 좌절하지는 마시길.)


6) 커뮤니티, 공개/공유된 자료 (community, google.com, coursera.org, etc)

국내는 아직 R사용자가 그리 많아보이지는 않으나, 해외에서는 이미 R사용자가 꽤 많다. R 분석하다가 뭔가 잘 안된다거나 궁금한게 있다면 Google에 검색해보라. 없는거 빼고 다 있다. R 커뮤니터, 블로그도 많다. R 관련 책도 많다. Coursera와 같은 오픈 강좌에도 R 관련 교육이 있다. 

(물론, 영어 못하면 소외된다. 그나마 다행인 것은, 작년부터 해서 올해 R 관련 한글책이 많이 출간되기 시작했고 또 오프라인 강좌도 하나 둘 생기고 있다는 점이다)


7) 쉬운 설치(Easy to install), 실습 데이터셋 (embedded data-set)

통계분석 공부 시작하는 초급자라면 클릭 몇 번으로 끝나는 쉬운 다운로드/설치, 그리고 분석을 위한 실습 데이터셋이 패키지에 기본으로 따라온다는 점이다. 분석 이론 공부 끝났는가? 그럼 10분 안에 공짜로 쉽게 설치해서 바로 데이터셋 불러다가 분석 실습할 수 있다. 빅데이터 분석한다고 하둡 클러스터 구성하고 소프트웨어 설치하다가 진빼고 지쳐 나가떨어져본 사람이라면 R 설치가 누워서 떡먹기보다 쉽다는 점에 놀라지 않을 수 없을 것이다. 거기다가 RStudio 깔아서 쓰면 사용자 UI도 꽤 좋고 편하다. (RStudio도 기업용이 아니라면 공짜.^^)

(물론, R도 패키지 찾아서 설치하는게 초보자에게는 어려운 과정일 수 있다. 그리고 빅데이터에도 암바리 같은 설치/관리를 도와주는 소프트웨어가 생겨서 초창기처럼 설치하다가 절망하고 포기하는 사태는 방지할 수 있게 되기도 했다)


8) 소위 뜨는 분석 언어 (Hot Job Trend)

R과 Python 공부하면 좋다고 긴 말이 필요 없을 것 같다. 아래의 3개 Job Trend 그래프를 보면 뭔가 느끼는게 있을 테니...

(* 그래프 source: http://r4stats.com/articles/popularity/)



(* 그래프 source: http://r4stats.com/articles/popularity/)



(* 그래프 source: http://r4stats.com/articles/popularity/)

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

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. Ailyn 2017.02.10 12:22 신고  댓글주소  수정/삭제  댓글쓰기

    R을 활용해보려고 했는데, 잘 읽고 갑니다 ^^; 출처 남기고 내용 참고해갑니당..

  2. jerardsong 2017.05.16 21:20  댓글주소  수정/삭제  댓글쓰기

    R공부중인 학생입니다. 좋은 글 감사합니다^^


2~3년 전만 해도 통계분석툴 R을 사용한다고 하면 "유지보수 해주는 곳도 없는 오픈소스 툴을 보수적인 우리나라 기업에서 도입하겠어?" 라면서 확산에 회의적으로 말씀하시는 분을 몇 분 본적이 있습니다.  

그런데 최근에는 주변에 R을 사용하는 기업도 생기기 시작했고, R에 대한 관심도 많아지고 있음을 피부로 실감하게 됩니다. 

저는 R을 혼자 공부했던지라 어렵게, 더디게, 무식하게 배웠는데요, 그때 제 옆에 물어볼 수 있고 또 코칭해줄 수 있는 누군가가 있었다면 참 좋았겠다 싶은 바램이 있었습니다. 

R을 처음 시작하시는 분들에게 쉽고 친하게 따라하면서 배울 수 있는 친구 같은, 동료 같은, 사수 같은 블로그를 지향하면서 블로그를 시작합니다. 

시중에 R 책도 많이 쏟아져 나오고 있는데요, 저는 블로그를 하면서 

1) R의 기본기에 충실하되 블로그의 장점인 검색이 된다는 점을 십분 활용해 필요한 R 기능 그때 그때 찾아서 쓸 수 있도록 체계적으로 정리하기 (...상용 통계툴 사용하시다가 R 입문하시는 분들이 어려워하는 부분).  

2) R의 툴 기능 외에 통계, 데이터마이닝의 기본 이론 개념에 대해서도 가급적 쉽게 이해할 수 있도록 내용을 구성하기 (...개발자 하시다가 R 분석 넘어오려는 분들이 어려워하는 부분)

3) 똑같은 사건을 보더라도 보는 관점에 따라서 이해와 해석이 달라질텐데요, 분석이라는 렌즈로 세상을 본다고 했을 때의 소소한 썰 풀어보기

4) 틈틈히 책 보다가 '이 책 참 맘에 든다' 싶은 책 있으면 갈무리도 할겸 추천도 할 겸 리뷰 글 쓰기

 등으로 구성해서 블로그 포스팅 해보려고 합니다. 


R에 6천 개가 넘는 패키지가 있는 만큼, 앞으로 분석 주제별로 좋은 패키지를 찾아서 사용법을 정리해나간다면 저도 그렇고 국내 R 사용자들에게도 작으나마 도움이 될 수 있지 않을까 하는 기대를 품어봅니다. 

R, 참 매력적인 오픈소스임에는 틀림없습니다!  ^^


* 덧글 :  데이터 분석에 일가견이 있는 선배들 중에 "분석 툴은 단지 툴일 뿐이다."라고 말씀하는 분들이 주위에 보면 무척 많은거 같아요. 그런데 말입니다, 저는 분별해서 듣기를 바랍니다. 주위에 요리사 대가들 한번 보세요. 칼질을 제대로 못해서 칼질 소리가 "또각....또각....또각...." 이런 요리사 본 적 있으세요?  요리의 대가들을 보면 칼질할 때 도마에서 나는 소리가 "뚜따따따따다다다다다다다다다다....." 입니다.  "분석 툴은 툴일 뿐이다"라고 분석 좀 한다는 분이 얘기를 하면 그 분(분석전문가) 입장에서는 맞는 말입니다.  하지만, 분석을 처음 시작하는 사람 입장에서는 "분석 툴이 서툴면 시작도 제대로 못하고, 분석 툴 사용법 힘겹게 익히면서 시간 다 까먹고, 지치고, 좌절하고 (이게 내 길 맞아?  난 소질이 없는건가? ... -_ㅜ), 심지어는 화도 났다가, 분석 & 보고서 마감에 시간이 쫒기어 노심초사 불안해 하고... 뭐 그렇게 됩니다.  일단 분석 툴 (저는 R 당연히 추천이요 ^^) 하나는 끝내주게 잘 사용할 수 있게끔 익혀두시면 나중에 생산성도 좋아지고, 심지어 분석 툴을 잘 앎으로써 새로운 아이디어도 생각해내는 경우도 있답니다.  "분석 툴은 단지 툴일 뿐이다"라는 말이 맞긴 한데요, 일단 분석 툴을 자유자재로 쓸 수 있는 경지에 오른 다음에 그런 말씀을 하시는게 순리라고 생각합니다.  분석 툴 제대로 쓰지도 못하면서 남들이 "분석 툴은 단지 툴일 뿐이라더라.."고 하는 말로 위안삼지 마시길 바랍니다.  분석 툴, 제대로 익혀두면 나중에 두고두고 좋아요. 

* 덧글 : R 교육 받으러 가보면 강사가 친절하게 R script를 다 작성해서 수강생들에게 공유를 해줍니다. 그러면 수강생들은 그거 블록 선택한 다음에 'Run' (Ctrl + Enter) 해보면서 실행을 해봅니다.  당연히 에러없이 잘 실행됩니다.  그런데 말입니다, 만약 이러고 끝내고서는 '음, 이제 나도 R 좀 할 줄 아는거 같다...'라고 위안을 삼으면 안됩니다.  R 수업 끝나고 돌아가서 업무에서, 집에서 공부하면서 따라해보고, 시행착오도 겪어보고, 에러 때문에 두세시간 구글링 빡세게 하면서 고생도 해보고 하면서 내공이 쌓이고 실력이 쌓이는 겁니다.  남이 짜 놓은 R script 눈이랑 검지 손가락으로 마우스 클릭하면서 실행시켜보고 나서 공부 다 했노라고 끝내지 마시길 바래요. "R 에러로 고생해본 만큼 실력"이 쌓이는게 맞는 말 같습니다.  


 

Posted by R Friend R_Friend
TAG r

댓글을 달아 주세요

  1. OriR 2016.05.20 00:39 신고  댓글주소  수정/삭제  댓글쓰기

    R 공부를 시작하는데 차근차근 보려고 합니다^^

  2. Kwonsu 2016.05.31 05:23  댓글주소  수정/삭제  댓글쓰기

    R 독학을 시작하려고하는데 좋은블로그를 찾은거같네요 :)
    앞으로 몇주?몇달간 잘부탁드려요!

  3. lovetoken 2017.01.06 16:47  댓글주소  수정/삭제  댓글쓰기

    "저는 R을 혼자 공부했던지라 어렵게, 더디게, 무식하게 배웠는데요, 그때 제 옆에 물어볼 수 있고 또 코칭해줄 수 있는 누군가가 있었다면 참 좋았겠다 싶은 바램이 있었습니다."

    너무 공감됩니다.
    블로그의 글들 항상 잘 보고 공부하고 갑니다! 감사합니다.

  4. 2017.02.16 10:50  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  5. ksu 2017.03.12 12:51  댓글주소  수정/삭제  댓글쓰기

    R을 혼자서 공부하는데 참 많은 도움이 되고 있습니다. 감사합니다.

  6. JIWON 2017.12.21 10:34  댓글주소  수정/삭제  댓글쓰기

    항상 잘 보고 있습니다!!^^ 감사합니다.

  7. 2017.12.21 15:08  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  8. Mill 2019.04.05 16:57  댓글주소  수정/삭제  댓글쓰기

    R 독학하려는 대학생인데 정말 감사합니다. :)

  9. 2019.04.07 08:06  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  10. Comsec 2019.04.07 08:13  댓글주소  수정/삭제  댓글쓰기

    정말 정리 잘 되어있습니다ㆍ
    많은 도움이 되겠습니다ㆍ 감사합니다ㆍ

  11. 2019.08.19 09:51  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • R Friend R_Friend 2019.08.19 10:23 신고  댓글주소  수정/삭제

      안녕하세요.

      bioinformatics using R 포스팅 하실때 제 블로그 인용해서 하셔도 됩니다. (전체 복사 & 붙여넣기만 아니면 됩니다.)

      korbillgates 블로그 쓰고 계시고 "바이오파이썬으로 만나는 생믈정보학" 책 저자신지요?

      저도 이 책 사서 공부하고 있는데요, 나중에 뵐 수 있는 기회가 되면 저자 싸인 좀 부탁드릴께요. :-)

    • 꾸리꾸리 2019.08.19 10:46  댓글주소  수정/삭제

      .......인용 허락은 감사합니다........
      저자는 아닙니다............그저 대학원에서 공부하는 학생입니다............. korbillgates 블로그도 제가 많이 도움을 얻는 곳중 하나라서.........그 블로그와 관련된 내용을 R로 게시해보려고 생각중입니다.

    • R Friend R_Friend 2019.08.19 11:05 신고  댓글주소  수정/삭제

      아, 그렇군요. 멋진 블로그 기대하겠습니다!

  12. soulspasm 2020.01.18 00:35 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 구글링하다가 발견했는데 큰 도움이 될 것 같습니다.
    R Studio를 실행할 때 에러가 발생하는 것 같아 문의 좀 드려도 될까요?
    맥 OS(카탈리나) 환경입니다.

    1. R Studio를 실행하면 상단에 "File Listing Error"라는 창이 뜨는데, 내용은 "Error navigating to ~/Desktop/R_Crawling:Operation not permitted"입니다.
    2. R Studio 사분면의 좌하단(콘솔 창인가요?)에는 "xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
    Warning: namespace ‘pbdZMQ’ is not available and has been replaced
    by .GlobalEnv when processing object ‘.pbd_env’"라고 나옵니다.

    • R Friend R_Friend 2020.01.18 14:33 신고  댓글주소  수정/삭제

      안녕하세요 soulspasm님.
      블로그 좋게 봐주셔서 감사합니다.

      저는 macOS Mojave 를 이용하고 있는데요, 댓글에 남겨주신 에러를 겪은 적이 없어서 정확하게는 잘 모르겠습니다.

      혹시 xcode 는 설치하셨는지요? 만약 xcode를 설치하지 않으셨다면 아래의 링크의 solution 답변에 달린 xcode 설치 가이드를 따라서 terminal에서 xcode를 설치하신 후에 다시 한번 R Stutio 시도해보시기 바랍니다.

      https://apple.stackexchange.com/questions/254380/why-am-i-getting-an-invalid-active-developer-path-when-attempting-to-use-git-a