====== 정해영의 R 노트 ====== Private 영역에 작성한 [[p:2019_r_note|2019 R note]]도 상호 보완적인 관계에 있으니 계속 업데이트해 나갈 것. ===== 유용한 글 링크 ===== * [[http://adv-r.had.co.nz/|Advanced R by Hadley Wickham]] <= **강력 추천!** * [[https://cran.r-project.org/doc/contrib/Verzani-SimpleR.pdf|Simple R by Verzani]] * [[http://dsmoon.tistory.com/entry/R%EC%96%B8%EC%96%B46%ED%8C%A9%ED%84%B0%EC%99%80-%ED%85%8C%EC%9D%B4%EB%B8%94?category=495494|문동선의 블로그: R언어-6.팩터와 테이블]] * [[https://www.r-bloggers.com/5-ways-to-subset-a-data-frame-in-r/|5 ways to subset a data frame in R]] * [[https://rpubs.com/tomhopper/brackets|Subsetting, extacting and bracket notation]] * [[https://stat.ethz.ch/pipermail/r-help/2008-April/158990.html|mode와 class의 차이]] * [[http://blog.naver.com/PostView.nhn?blogId=podiumdesign&logNo=220246628655|설치된 패키지의 로드 - require()와 library()의 차이점]] require()의 경우 미설치 패키지를 불러다 설치까지 한다(?) * [[https://blogazonia.wordpress.com/2014/05/08/import-multiple-files-to-r/|Import multiple (CSV) files to R]] * [[http://www.datasciencemadesimple.com/join-in-r-merge-in-r/|Join in R: How to join (merge) data frames (inner, outer, left, right) in R]] * 제37회 KOBIC 차세대 생명정보학 교육 "R을 이용한 데이터 통계 분석 및 시각화" [[http://genoglobe.kr/kribb/bioinfo#%EC%A0%9C37%ED%9A%8C_%EA%B5%90%EC%9C%A1_r%EC%9D%84_%EC%9D%B4%EC%9A%A9%ED%95%9C_%EB%8D%B0%EC%9D%B4%ED%84%B0_%ED%86%B5%EA%B3%84_%EB%B6%84%EC%84%9D_%EB%B0%8F_%EC%8B%9C%EA%B0%81%ED%99%94_-_%EC%88%98%EA%B0%95%EC%83%9D%EC%9C%BC%EB%A1%9C_%EC%B0%B8%EC%84%9D|강좌 소개]] 및 [[r_source_code|실습용 코드]] * [[http://www.r-tutor.com/r-introduction|R introduction]] * [[https://www.rstudio.com/resources/cheatsheets/|RStudio Cheat Sheets]] * R Friend [[https://rfriend.tistory.com/118|R 단일 모집단 분석과 정규성 검정]] ===== R graphics ===== * [[https://www.harding.edu/fmccown/r/|Producing simple graphs with R]] * [[https://seananderson.ca/courses/11-multipanel/multipanel.pdf|Multipanel plotting in R (with base graphics)]] ===== Stack Overflow에 게시된 글 ===== * [[https://stackoverflow.com/questions/25314336/extract-the-maximum-value-within-each-group-in-a-dataframe|Extract the maximum value within each group in a dataframe]] * [[https://stackoverflow.com/questions/9723208/aggregate-summarize-multiple-variables-per-group-i-e-sum-mean-etc|Aggregate / summarize multiple variables per group (i.e. sum, mean, etc)]] * [[https://stackoverflow.com/questions/21982987/mean-per-group-in-a-data-frame|Mean per group in a data.frame [duplicate-위의 것과 사실상 같은 질문]]] ===== 정해영의 블로그: 하루에 한 R 시리즈 ===== [[http://blog.genoglobe.com/search?q=%ED%95%98%EB%A3%A8%EC%97%90+%ED%95%9C+R&max-results=20&by-date=true|[하루에 한 R] - 전체 블로그 글을 날짜순으로 정렬하여 보여주기]] ===== KGOL 강좌 수강 노트 ===== [[R을 활용한 통계학 개론(2018)]] [[https://www.kgol.org/course/course_view.jsp?id=9056&cid=4933&ch=course|강좌 소개]] ===== 짧은 팁 ===== > .Platform > graphics.off() # 모든 그림 화면 끄기 > rm(list=ls()) # Removes all objects from the current workspace (R memory) > search() # 설치된 패키지 확인 > edit(var) # 데이터 편집기 ===== 긴 팁(코드 조각) ===== [[R snippets]] ===== 질문 리스트 ===== * class(), mode(), str() * rownames() vs. row.names() * names() vs. colnames(): data frame의 경우 동일함 ===== 꼭 알아야 할 개념과 기술 목록 ===== * loop를 사용하는 것을 지양한다. - 가끔은 필요할 때가 있다(여러 csv 파일을 동시에 읽어들이기) * list를 잘 다루어야 한다. * list 내의 원소에 접근하는 방법을 정확히 알아야 한다. * 매트릭스 형태의 데이터를 다루는데 익숙해야 한다. - column 및 row name - slicing - apply()를 적절히 사용할 줄 알아야 한다. * Graphics: plot area, margin 등의 개념을 이해하고 잘 조절할 줄 알아야 한다. ===== 활용 사례 ===== ==== CSV 파일의 병합 ==== * [[https://blog.genoglobe.com/2018/01/r-phylosift-tab-delimited-csv.html|[하루에 한 R] PhyloSift 결과 종합하기(tab-delimited CSV 파일의 일괄 입력 및 병합 등)]] ==== 데이터프레임-행과 열의 이름 일괄 변경 ==== * [[https://blog.genoglobe.com/2019/02/r-keyvalue.html|[하루에 한 R] Key/value 형태의 자료를 이용한 치환]] ==== 데이터프레임-행과 열의 이름을 통한 조작 ==== * [[https://blog.genoglobe.com/2018/02/r-ani-column-row.html|[하루에 한 R] ANI 계산 결과 다루기 - column 혹은 row 이름을 통한 조작]] ==== 데이터프레임-특정 조건을 충족하는 데이터의 추출 ==== * [[https://blog.genoglobe.com/2015/04/r-row.html|[하루에 한 R] 특정 조건에 맞는 row만 출력하기]] * [[https://blog.genoglobe.com/2017/12/r-row.html|[하루에 한 R] 매트릭스에서 특정 값을 갖는 row 추출하기]] {{ :asdb_search_results.zip |antiSMASH 데이터셋}}을 사용한다. 첫 줄의 '#'는 삭제할 것. $ wget http://genoglobe.kr/kribb/_media/asdb_search_results.zip $ unzip asdb_search_results.zip $ cp asdb_search_results.csv asdb_search_results.csv.bak $ awk '{gsub("^#", ""); print}' asdb_search_results.csv.bak > asdb_search_results.csv data = read.table("asdb_search_results.csv",sep="\t",header=T) # by column index data[,6] data[,c(1,2,3)] data[,1:5] # by column name data$Strain # 반환되는 것은 factor strain.nr = levels(data$Strain) # strain이 몇 가지나 되는가? data[which(names(data) == "Strain")] # 반환되는 것은 data frame data[names(data) == "Strain"] # which()를 쓰지 않아도 작동은 한다. data[which(names(data) == "NCBI.accession")] # 다른 사례 data[which(names(data) %in% c("Strain","Species"))] # 여러 컬럼을 추출하기 sel.col = c("Strain","NCBI.accession","From","To","BGC.type") data[which(names(data) %in% sel.col)] # Genus와 Species 컬럼을 결합하고 문자열 치환하기 data$Species = paste(data$Genus, data$Species, sep=" ") data = data[,-1] data$Species = gsub("Unclassified", "sp.", data$Species) # 다음과 같이 해도 된다. #data[,2] = paste(data[,1], data[,2], sep=" ") #data = data[,-1] #data[,1] = gsub("Unclassified", "sp.", data[,1]) # 조건에 맞는 row 전체 혹은 일부 컬럼만 추출하기 data[which(data$Strain == "E681"),] # do not omit comma! data[which(data$Strain == "E681"), names(data) == "Most.similar.known.cluster"] # how to extract multiple strains? sel.str = c("E681","M1","CR1") data[which(data$Strain %in% sel.str),] # working! data[which(data$Strain %in% sel.str), names(data) == "Most.similar.known.cluster"] # logical indexing L = data$Strain == "E681" data[L,] data[L,]$NCBI.accession # using subset() function subset(data, Strain == "E681") subset(data, Strain == "E681", select = c("Strain","From","To")) # restict to specified columns subset(data, Strain = c("E681","M1","CR1")) # not working! subset(data, Strain %in% c("E681,"CR1")) # not working # use dplyr() for advanced applications ==== 데이터프레임- row-wise maximum ==== * [[https://blog.genoglobe.com/2017/12/r-blast-tabular-output-best-hit.html|[하루에 한 R] BLAST tabular output에서 best hit 뽑아내기]] ===== 샘플 데이터 ===== * {{ :anib_percentage_identity.zip |ANI percentage identity (pyani)}} - 12 Lactobacillus rhamnosus genomes. col/row label의 형식은 "Lactobacillus_rhamnosus_BFE5264_GCF_001988935.1"이다. * {{ :anib_percentage_identity_lactobacillus_rhamnosus.zip |}}(pyani) - 12 Lactobacillus rhamnosus genomes. col/row label의 형식은 "Lactobacillus_rhamnosus_BFE5264_GCF_001988935.1"이다. * {{ :anib_percentage_identity_paenibacillus.zip |ANI percent identity (pyani)}} - 51 Paenibacillus genomes. col/row label의 형식은 "GCF_000146875.3"이다. * {{ :asdb_search_results.zip |antiSMASH db file}} [[https://antismash-db.secondarymetabolites.org/#!/query|source link]] - search result using the keyword "Paenibacillus"