Rでの前処理として覚えたこと

dataframeを以下、dfとする。

の前に、他との比較

  • plyrのほうが簡単だけど、下記のdplyrのほうを先に触ってしまった
  • dplyrというRのパッケージが一番直感的かつ簡潔に書ける
    • pipeによるデータの扱いとSQL likeな関数による覚えやすさがのため
  • PandasというPythonのパッケージでもR標準のdfと同じように書ける
    • ただし、列や行のアクセスに違いあり、かつdplyrのほうが便利
    • 便利だけど、Pythonの方が前処理メインなのでPythonでやってる
    • pandas16にもpipeが出てきたので要チェック

覚えたこと

  • dfの作り方(行列、ベクトルから)
  • 行の連結(df同士、dfとベクトル)
  • 列の追加
    • 列への関数適用
    • 忘れやすそうな否定とべき乗
    • cbindでの行列作成とdfとの結合
    • transformによる結合
      • and/orの方法
  • dfを列で結合(Left Join)
  • 欠損値の埋め方
    • 対象列の判定
    • ifelse
  • 行のシフト
    • 時系列での扱いのため
    • 例:セッションログを用いて滞在時間を測るなど
  • ファイルへの書き込みと、そのファイルの読み込む
# make dataframe from vector
df <- data.frame(matrix(1:8, ncol = 2), stringsAsFactors = False)
df2 <- data.frame(1:2, stringsAsFactors = False)

# concat row
df <- rbind(df, df)
df2 <- rbind(df2, c(3))

# define function
odd <- function(n) return(n %% 2 == 1)

# add column
df$odd <- sapply(X = df[, "X1"], odd)
df$even <- !(df$odd)
df <- cbind(df, cbind(and = (df$odd & df$even),
                      or = (df$odd | df$even)))

df2$square <- df2[, 1] ^ 2
df2 <- transform(df2,
                 up.to.low = tolower(LETTERS[1:3]),
                 low.to.up = toupper(letters[-1:-23]))

# merge, left join
merged <- merge(x = df, y = df2, by.x = c(1), by.y = c(1), all.x = TRUE)

# fill na
merged$fill1 <- merged$square
merged[is.na(merged$fill1), "fill1"] <- 0
merged$fill2 <- ifelse(is.na(merged$square), 0, merged$square)

# shift column
shift <- function(x, n) {
  if (n < 0) {
    return(c(rep(NA, abs(n)), head(x, n)))
  } else if (n > 0) {
    return(c(tail(x, -n), rep(NA, abs(n))))
  } else {
    return(x)
  }
}
merged$shift.up <- shift(merged$X1, 1)
merged$shift.down <- shift(merged$X1, -1)

# write to file and read from file
write.table(merged, "output_dataframe.txt", append=F, quote=F, col.names=T)
result <- read.table(file = "output_dataframe.txt", header = TRUE)

print(result)
library(plyr)

# grouping
jobs <- data.frame(id=1:12,
                   field=c(rep("web", 6), rep("sports", 6)),
                   category=c(rep("infra", 2), rep("frontend", 4),
                              rep("soccer", 3), rep("tennis", 2), "baseball"))
jobs.counts <- ddply(jobs, .(field, category), summarize, counts = length(id))

# full outer join
hobby.soccer <- data.frame(id=1:10, rep(1, 10))
hobby.tennis <- data.frame(id=6:15, rep(1, 10))
hobby.all <- merge(hobby.soccer, hobby.tennis, by="id", all = TRUE)

# String concatenation
c(paste("a", "b", sep = ""), paste0("a", "b"))

# run as Script
# R --vanilla --slave < script.R
# RScript --vanilla --slave script.R

# first arg is args[1]
args <- commandArgs(trailingOnly = T)
# arg[5] is first arg from cli
args <- commandArgs()

# padding
sprintf("%03s", "a")
sprintf("%3s", "a")
sprintf("%-3s", "a")

感想

  • 前処理は無理にRでやらなくてよさそうだと思った(PythonのPandasを触ったことがあるため
  • 次は分析系Packageとコマンドライン引数の扱いを覚えたい