Tips

Here I present some random R, Git, Bash tips and tricks I have learned from various resources. (Stackoverflow, Google, Wikia etc

R

purrr::map_dfr() 사용하기

여러개의 tibble object를 하나로 합치면서 .id를 추가하면 mutate() 처리가 되어 새로운 행이 하나 생기게 됩니다. 좋은 팁이라고 생각됩니다.

data_dir <- "my_target_directory"

data_dir %>% 
  dir_ls(regexp = "\\.csv$") %>% 
  map_dfr(read_csv, .id = "source") 

Reference: mrchypark 블로그

Remove columns with all NAs or all blank values

naRemove <- function(df) Filter(function(x) !all(is.na(x)) & !all(trimws(x) == ''), df)

Reference: https://stackoverflow.com/questions/2643939/remove-columns-from-dataframe-where-all-values-are-na

switch

If value is a character vector then the element of ‘…’ with a name that exactly matches value is evaluated. If there is no match a single unnamed argument will be used as a default. If no default is specified, NULL is returned.

> y <- "fruit"
> switch(y, fruit = "banana", vegetable = "broccoli", "Neither")
[1] "banana"
> y <- "meat"
> switch(y, fruit = "banana", vegetable = "broccoli", "Neither")
[1] "Neither"
A common use of switch is to branch according to the character value of one of the arguments to a function.

> centre <- function(x, type) {
+ switch(type,
+        mean = mean(x),
+        median = median(x),
+        trimmed = mean(x, trim = .1))
+ }
> x <- rcauchy(10)
> centre(x, "mean")
[1] 0.8760325
> centre(x, "median")
[1] 0.5360891
> centre(x, "trimmed")
[1] 0.6086504

Reference: R language definition

stars.pval {gtools}

This will convert p-value to stars (*).

stars.pval <- function (p.value) {
    unclass(symnum(p.value, corr = FALSE, na = FALSE, cutpoints = c(0, 
        0.001, 0.01, 0.05, 0.1, 1), symbols = c("***", "**", 
        "*", ".", " ")))
}

identifying os

get_os <- function(){
  sysinf <- Sys.info()
  if (!is.null(sysinf)){
    os <- sysinf['sysname']
    if (os == 'Darwin')
      os <- "osx"
  } else { ## mystery machine
    os <- .Platform$OS.type
    if (grepl("^darwin", R.version$os))
      os <- "osx"
    if (grepl("linux-gnu", R.version$os))
      os <- "linux"
  }
  tolower(os)
}

Reference: conjugateprior.org

math styles in R plots

demo(plotmath)

Converting a matrix of characters into numeric

mat <- matrix(c("5","6","7","8","hello","world"),ncol=3)
class(mat) <- "numeric"

Git

submodule

git clone https://github.com/aikiframework/json.git --recursive
git submodule update --init # fetch submodules if you already cloned but forgot --recursive

Reference: Stackoverflow

Reducing size

git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now

Reference: npteam

Github open

# Opens the github page for the current git repository in your browser
# git@github.com:jasonneylon/dotfiles.git
# https://github.com/jasonneylon/dotfiles/
function gh() {
  giturl=$(git config --get remote.origin.url)
  if [ "$giturl" == "" ]
    then
     echo "Not a git repository or no remote.origin.url set"
     exit 1;
  fi
 
  giturl=${giturl/git\@github\.com\:/https://github.com/}
  giturl=${giturl/\.git/\/tree/}
  branch="$(git symbolic-ref HEAD 2>/dev/null)" ||
  branch="(unnamed branch)"     # detached HEAD
  branch=${branch##refs/heads/}
  giturl=$giturl$branch
  open $giturl
}

Git initializing

echo "# REPONAME" >> README.md
git init
git add .
git commit -m "first commit"
git remote add origin https://github.com/shanmdphd/REPONAME.git
git push -u origin master

.gitignore

Ignore 되어야 하지만 이미 add된 파일 표시

git ls-files -ci --exclude-standard

Ignore 되어야 하지만 이미 add된 파일을 GIT에서 제거 (파일 자체는 남겨둠.)

git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached

Syncing a fork

git remote add --track master upstream https://github.com/mmistakes/so-simple-theme.git
git fetch upstream
git merge upstream/master --allow-unrelated-histories
git checkout --ours README.md
git checkout --theirs README.md

Reference: Dogfeet

Diagram

Reference: bunhere.tistory.com

In case of fire


Bash

Convert PDF to PNG - multiple files

for file in *_PK_Model_DV_vs_PRED.pdf; do
    convert -density 300 "$file" "${file%.pdf}.png"
done

Replace string across directories

grep -rl 'NonCompart' * | xargs sed -i '' -e 's/NonCompart/ncar/g'

Lazygit : git add, commit, push for lazy people like me.

Copy & paste this lines to your ~/.bash_profile

function lazygit() {
    git add .
    git commit -a -m "$1"
    git push
}
lazygit "Update README.md"

Vim

Dos > Unix conversion

se ff=unix

Reference: mwultong

find all the word ‘foo’ where there is no ‘bar’ following, we can do:

/foo\(.*bar\)\@!

Reference: Wikia

Word count

%s/[^ ]\+//gn

Reference: Wikia

Title case

s/\<\(\w\)\(\w*\)\>/\u\1\L\2/g

Reference: Wikia

Quote

줄의 앞뒤로 따옴표 붙이기

%s/^\(.*\)$/"\1"/
%s/.*/"&"

줄의 맨 뒤로 따옴표 붙이기

%s/^\(.*\)$/\1"/

Bash

cat foo.txt | sed s/^\(.*\)$/"\1"/g

Reference: Stackoverflow

Markdown 에서 bullet 맨 앞에 대문자로

:%s/\(- [a-z]\)/\U\1/

Reference: Wikia

VB

Repeat Header Row in Word

Sub RepeatTableHeadings()

  Dim tbl As Table

  For Each tbl In ActiveDocument.Tables
    tbl.Rows(1).HeadingFormat = True
  Next tbl

End Sub

Reference: BeyondVBA

Image resize

Sub resize()
Dim i As Long
With ActiveDocument
    For i = 1 To .InlineShapes.Count
        With .InlineShapes(i)
            .ScaleHeight = 24
            .ScaleWidth = 24
        End With
    Next i
End With
End Sub

Reference: superuser

Mathematics

Commonly Used Distribution


NONMEM

covariate-screening

for file in *.ctl; do
    sh ../../run.sh ${file%.ctl}
done