2015年12月21日月曜日

R よく使うもの一覧

2016-04-14
########### データ連結 ###########
# dfを縦に連結(x と y の列名が全て同じ場合)
rbind(df.x, df.y)
# dplyrのrbind_all (複数のdfを縦に連結)
rbind_all(list(df.x, df.y, df.z,))
# dfを横に連結(x と y の行数が同じ場合)
cbind(df.x, df.y)
# dplyr join
inner_join(df.x, df.y, by = "key")   # x と y の by がマッチする行のみ
left_join(df.x, df.y, by = "key")    # x の全ての行を保持。y に複数マッチする行があったらすべて保持
full_join(df.x, df.y, by = "key")    # x と y の全ての行を保持
anti_join(df.x, df.y)                # y にマッチしない x の行のみ
inner_join(df.x, df.y, by = c("key_1", "key_2"))   # 複数key指定
inner_join(df.x, df.y, by = c("key_1" = "key_a"))  # keyが別名のjoin
########### データ加工・集計 ###########
df.x$uid <- as.character(df.x$uid) #文字列に直す
df[df$x >=     1     &  1000   >= df$x, ]$x <- "A" #条件を満たした列を書き換える
str_c("g:", df.201511_start_and$user_id) #user_id の先頭にg:を付ける library(stringr)が必要
options(digits=10)  # 表示桁数を10桁に変える
read.csv(file_pass, fileEncoding = "Shift_jis") #文字化けを防ぐ方法
fread() #文字コードを変更できない(関数がない)
count(df, x, y)  # group_by(x) %>% summarise(num = length()) と同じ
comsum(df.x$x)  #累積和
n_distinct(df.x) # ユニーク数カウント length(unique(df.x)) と同じ
distinct(df, x)  # ユニークデータのみ抽出(デフォルトは、最初にあるデータになる)
filter(df, x == 1) # 条件を指定して、該当する行を抽出
rename(df, 変更後列名 = 変更後列名) # 列名変更
select(df, x, y)  # 指定した列を抽出
arrange(df, x, y) # 昇順 arrange(df, desc(column))で降順
summarise_each(funs(min, mean, max), x, y, z) # 繰り返して、
df.new <- df.new[,-1] # 1列目を消す
df.login_05$user_id <- str_c("@", df.login_05$user_id)         # user_idの先頭に"@"を追加 library(stringr)が必要
#group_by(x) でxだけ取り出したい
# ユニークデータのみ抽出(デフォルトは、最初にあるデータになる)
distinct(df, x)  %>%
  select(x)
# (df.a <- fread("/a.csv"))  ()で囲むと先頭5行と最後5行が表示される
df.old <- df.old[,-1] #1列目削除
#unix timeの変換
udate <- 1451029742
t <- as.POSIXct(udate,origin="1970-01-01")
#NAを0にする
df.all[is.na(df.all)] <- 0
#日時の差
set.date1 <- "2015-01-01 00:00:00"
set.date2 <- "2015-01-02 01:00:00"
as.POSIXct(set.date1) - 86400 #1日=86400秒
as.Date(set.date1) - 1
as.POSIXct(set.date2) - 86400
as.Date(set.date2) - 1
as.POSIXct(set.date2) - as.POSIXct(set.date1)
as.Date(set.date2) - as.Date(set.date1)
#特定の列だけを書き換えたい
df.pay_last_month$pay_rank <- "N"
df.rank_1m[df.rank_1m$rank == 1,]$rank <- "a"
#サンプルデータ作成
v.x1 <- c(1,2,3,4,5,6,7,8,9,10)
v.x2 <- c("a","a","b","b","b","c","c","c","c","c")
v.x3 <- c(1000,900,800,700,600,500,400,300,200,100)
df.x <- data.frame(id = v.x1, item = v.x2, price =v.x3)
#8桁の数字を日付に変換
#サンプルデータ作成
v.date <- c(20160101,20160102,20160103)
df.test <- data.frame(date = v.date)
df.test
#①文字に変換
df.test$date <- as.character(df.test$date) #数字ではas.Dateできないため文字に変換
#②日付に変換
df.test$date <- as.Date(df.test$date, "%Y%m%d") #文字に変換後、日付に変換
df.test
#新たな列を追加
df.x$new <- "0"
#条件式
df.x[df.x$item == "c" & df.x$price >= 500,]$new <- "ok"
#指定の範囲の文字列だけを取り出す
set.date0 <- "2015-01-01 00:00:00"
set.date0
set.year <- substring(set.date0,1,4) #1~4文字目までの文字(年数)を取り出す
set.year
set.month <- substring(set.date0,6,7)
set.month
set.ym <- substring(set.date0,1,7)
set.ym
########### グラフ ###########
# ヒストグラム
hist(df, breaks = seq(10, 10000, 100))
# 横軸の範囲と分割の幅seq(範囲の最小値, 範囲の最大値, 表示範囲の間隔)
# 10から10000までを100単位で表示
hist(log10(df.month_201507$total_purchase), breaks = "Scott",freq = F)
# 散布図
plot() #対数軸 plot(,log = "xy")
# 棒グラフ
barplot()
# 円グラフ
pie()
#箱ヒゲ図
boxplot()
#複数のグラフを重ねる
plot(df.sum_fal$total, log = "xy",xlim = c(1,3000), ylim = c(100,1000000),xlab = "pay_rank",ylab = "pay", col = 1)
par(new=T)
plot(df.sum_anm$total, log = "xy",xlim = c(1,3000), ylim = c(100,1000000),xlab = "pay_rank",ylab = "pay", col = 2)
par(new=T)
plot(df.sum_mel$total, log = "xy",xlim = c(1,3000), ylim = c(100,1000000),xlab = "pay_rank",ylab = "pay", col = 3)
par(new=T)
plot(df.sum_san$total, log = "xy",xlim = c(1,3000), ylim = c(100,1000000),xlab = "pay_rank",ylab = "pay", col = 4)
legend("bottomleft", legend = c("fal","anmas","melty","sangoku"), col = c(1,2,3,4), pch = 1)

########### 文字コードの変換について ###########
df.test <- read("C:/---.csv")
df.test <- iconv(df.test,from = "UTF-8",to = "SJIS")
df.test <- data.frame(df.test)
sum(df.test$price)
iconvlist()
########### クロス集計 ###########
#cross集計
library(reshape2)
library(data.table)
#サンプルデータ作成
v.x1 <- c("oda","oda","oda","toyo","toyo","toyo","ie","ie","ie","ie")
v.x2 <- c("a","a","b","b","b","c","c","c","c","c")
v.x3 <- c(1000,900,800,700,600,500,400,300,200,100)
df.x <- data.frame(user_id = v.x1, item = v.x2, price =v.x3)
df.x
#クロス集計 要素数はlength
tmp <- acast(df.x, user_id ~ item, sum, value.var = "price")
tmp
df.cross <- data.frame(tmp)
write.csv(df.cross,file = "./cross.csv")
df.cross <- fread("./cross.csv")
df.cross <- data.frame(df.cross)
names(df.cross)[1] <- c("user_id")
df.cross
########### logit ###########
setwd("C:/---")
getwd()
#サンプルデータを読み込む
df.sample <- fread("./sample.csv")
df.sample <- data.frame(df.sample)
#先頭6行のデータを表示
head(df.sample)
result <- glm(diff_dr ~ au,data = df.sample)
summary(result)
plot(df.sample$dr,df.sample$po)
########### k-means ###########
result <- kmeans(df.sample,3)
summary(result)
result <- result$cluster
result <- data.frame(result)
########### ローレンツ曲線 ###########
# ローレンツ曲線を描き,ジニ係数を計算する
Gini.index <- function(y,
                       # データベクトル
                       main = "",
                       # 図のタイトル(省略時は何も書かない)
                       xlab = "",
                       # x 軸の名前(省略時は何も書かない)
                       ylab = "")
  # y 軸の名前(省略時は何も書かない)
{
  stopifnot(y >= 0)                       # 非負データでなければならない
  n <- length(y)                               # データの個数
  y <- sort(y)                         # 小さい順に並べる
  y <- cumsum(y)                               # 累積度数をとる
  y <- c(0, y / y[n])                    # 累積相対度数(先頭に 0 を加える)
  x <- seq(0, 1, length = n + 1)           # 0 ~ 1 を等間隔に区切ったベクトルを作る
  old <- par(xaxs = "i", yaxs = "i")
  plot(
    x,
    y,
    type = "l",
    col = "gold",
    # これを結ぶとローレンツ曲線
    main = main,
    xlab = xlab,
    ylab = ylab
  )
  abline(0, 1)                            # 対角線(原点を通る,傾き 1 の直線)を描く
  par(old)
  return(2 * sum(x - y) / n)                    # ジニ係数
}
Gini.index(df.fal_kakin$total,
           main = "Lorenz curve",
           xlab = "",
           ylab = "")
########### 統計 ###########
p = 10 #アイテムを落とす確率
d = c() #試行結果を格納するベクトル
for(i in 0:1000)
{
  success = 0
  for(j in 1:100)
  {
    r = sample(1:100,1) #1~100の母集団から一つの標本を取り出す
    if(r <= p)
    {
      success = success + 1
    }
  }
  d[i] = success
}
mean_d <- mean(d) #平均
sigma_d <- sd(d) #標準偏差
-1.96 *
########### 月次 ###########
library(epitools)
time <- as.Date("2014-02-01")
month <- as.month(time)
month
month$month
df.test$month <- as.month(df.test$CREATE_DATE)$month #月変換処理

R セグメント分けと集計

目的:ユーザ別で集計した結果を条件に従ってセグメント分けして各セグメントの合計を求める
補足:library(dplyr)が必要

#サンプルデータ作成
v.x1 <- c("oda","oda","oda","toyo","toyo","toyo","ie","ie","ie","ie")
v.x2 <- c("a","a","b","b","b","c","c","c","c","c")
v.x3 <- c(100,100,800,700,600,500,4000,5000,2000,1000)
df.payment_log <- data.frame(user_id = v.x1, item = v.x2, payment =v.x3)

> df.payment_log
   user_id item payment
1      oda    a     100
2      oda    a     100
3      oda    b     800
4     toyo    b     700
5     toyo    b     600
6     toyo    c     500
7       ie    c    4000
8       ie    c    5000
9       ie    c    2000
10      ie    c    1000

#各ユーザの合計を求める
df.user_payment <- df.payment_log %>%
  group_by(user_id) %>%
  summarize(pay_total = sum(payment))

> df.user_payment
Source: local data frame [3 x 2]

  user_id pay_total
   (fctr)     (dbl)
1      ie     12000
2     oda      1000
3    toyo      1800

 #セグメントに分ける
df.user_payment$rank <- "N"
df.user_payment[df.user_payment$pay_total >= 1 & df.user_payment$pay_total <= 1000,]$rank <- "C"
df.user_payment[df.user_payment$pay_total >= 1001 & df.user_payment$pay_total <= 10000,]$rank <- "B"
df.user_payment[df.user_payment$pay_total >= 10001,]$rank <- "A"

> df.user_payment
Source: local data frame [3 x 3]

  user_id pay_total  rank
   (fctr)     (dbl) (chr)
1      ie     12000     A
2     oda      1000     C
3    toyo      1800     B

 #セグメント別に集計する
df.seg <- df.user_payment %>%
  group_by(rank) %>%
  summarise(pay = sum(pay_total), pu = length(user_id))

> df.seg
Source: local data frame [3 x 3]

   rank   pay    pu
  (chr) (dbl) (int)
1     A 12000     1
2     B  1800     1
3     C  1000     1

2015年9月16日水曜日

R すべてのNAを置換

【目的】 すべてのNA(欠損値)を置換する
【方法】 df.all[is.na(df.all)] <- 0

df.allのNAをすべて置換するには、

df.all[is.na(df.all)] <- 0

でOK。

R クロス集計(acast)

目的:Rでエクセルのピポッドテーブルのようなクロス集計をおこなう
方法:acastを使う
補足:library(reshape2)が必要

 #サンプルデータ作成
v.x1 <- c("oda","oda","oda","toyo","toyo","toyo","ie","ie","ie","ie")
v.x2 <- c("a","a","b","b","b","c","c","c","c","c")
v.x3 <- c(1000,900,800,700,600,500,400,300,200,100)
df.x <- data.frame(user_id = v.x1, item = v.x2, price =v.x3)

df.x
> df.x
   user_id item price
1      oda    a  1000
2      oda    a   900
3      oda    b   800
4     toyo    b   700
5     toyo    b   600
6     toyo    c   500
7       ie    c   400
8       ie    c   300
9       ie    c   200
10      ie    c   100

 #クロス集計
tmp <- acast(df.x, user_id ~ item, sum, value.var = "price")

tmp
> tmp
        a    b    c
ie      0    0 1000
oda  1900  800    0
toyo    0 1300  500


#補足:user_idの列を無理やり作る

df.cross <- data.frame(tmp)
write.csv(df.cross,file = "./cross.csv")
df.cross <- fread("./cross.csv") #llibrary(data.table)が必要
df.cross <- data.frame(df.cross)

df.cross
> df.cross
    V1    a    b    c
1   ie    0    0 1000
2  oda 1900  800    0
3 toyo    0 1300  500

names(df.cross)[1] <- c("user_id")

df.cross
> df.cross
  user_id    a    b    c
1      ie    0    0 1000
2     oda 1900  800    0
3    toyo    0 1300  500


追記:acastは遅いのでspreadがお勧め
R 高速に大規模データのクロス集計をおこなう(tally, spread)

2015年8月31日月曜日

R 条件式にもとづいて列の内容を変える

【目的】 条件式にもとづいて列の内容を変える
【方法】 df.x[dfx$x == 1, ]$new <- "x"

#サンプルデータ作成
v.x1 <- c(1,2,3,4,5,6,7,8,9,10)
v.x2 <- c("a","a","b","b","b","c","c","c","c","c")
v.x3 <- c(1000,900,800,700,600,500,400,300,200,100)
df.x <- data.frame(id = v.x1, item = v.x2, price =v.x3)
> df.x
   id item price
1   1    a  1000
2   2    a   900
3   3    b   800
4   4    b   700
5   5    b   600
6   6    c   500
7   7    c   400
8   8    c   300
9   9    c   200
10 10    c   100

#新たな列を追加
df.x$new <- "0"
> df.x
   id item price new
1   1    a  1000   0
2   2    a   900   0
3   3    b   800   0
4   4    b   700   0
5   5    b   600   0
6   6    c   500   0
7   7    c   400   0
8   8    c   300   0
9   9    c   200   0
10 10    c   100   0

 #条件式
df.x[df.x$item == "c" & df.x$price >= 500,]$new <- "ok"
> df.x
   id item price new
1   1    a  1000   0
2   2    a   900   0
3   3    b   800   0
4   4    b   700   0
5   5    b   600   0
6   6    c   500  ok
7   7    c   400   0
8   8    c   300   0
9   9    c   200   0
10 10    c   100   0

2015年8月28日金曜日

R 棒グラフを描く(barplot)

【目的】 Rで棒グラフを描く
【方法】 barplot()

#サンプルデータ作成
v.x1 <- c(1,2,3,4,5,6,7,8,9,10)
v.x2 <- c("a","a","b","b","b","c","c","c","c","c")
v.x3 <- c(1000,900,800,700,600,500,400,300,200,100)
df.x <- data.frame(id = v.x1, item = v.x2, price =v.x3)

#先頭6行のデータを表示
head(df.x)
> head(df.x)
  id item price
1  1    a  1000
2  2    a   900
3  3    b   800
4  4    b   700
5  5    b   600
6  6    c   500

#最小値、第1四分位点、中央値、平均値、第3四分位点、最大値(カテゴリカル変数は度数)
summary(df.x)
> summary(df.x)
       id        item      price     
 Min.   : 1.00   a:2   Min.   : 100  
 1st Qu.: 3.25   b:3   1st Qu.: 325  
 Median : 5.50   c:5   Median : 550  
 Mean   : 5.50         Mean   : 550  
 3rd Qu.: 7.75         3rd Qu.: 775  
 Max.   :10.00         Max.   :1000  

#xtabs:カテゴリーの度数をデータとして得る
data.item <- xtabs(~ item, data = df.x)
data.item
> data.item
item
a b c 
2 3 5 

#棒グラフ
barplot(data.item)

#並び替え 降順:decreasing = TRUE
data.item2 <- data.item[order(data.item, decreasing = TRUE)]
barplot(data.item2)


Rでの棒グラフ作図に関するより詳しい説明
http://stat.biopapyrus.net/graph/barplot.html

R 日時の差を計算

set.date1 <- "2015-01-01 00:00:00"
set.date2 <- "2015-01-02 01:00:00"

as.POSIXct(set.date1) - 1
as.Date(set.date1) - 1
> as.POSIXct(set.date1) - 1
[1] "2014-12-31 23:59:59 JST"
> as.Date(set.date1) - 1
[1] "2014-12-31"

as.POSIXct(set.date2) - 1
as.Date(set.date2) - 1
> as.POSIXct(set.date2) - 1
[1] "2015-01-02 00:59:59 JST"
> as.Date(set.date2) - 1
[1] "2015-01-01"

as.POSIXct(set.date2) - as.POSIXct(set.date1)
as.Date(set.date2) - as.Date(set.date1)
> as.POSIXct(set.date2) - as.POSIXct(set.date1)
Time difference of 1.041667 days
> as.Date(set.date2) - as.Date(set.date1)
Time difference of 1 days







R 順番を変える(arrange)

【目的】 指定した列を抽出する
【方法】 arrange(df, v1, v2) で 昇順、arrange(df, desc(column))で降順
【補足】 library(dplyr)が必要

#テスト用データフレーム作成
v.x1 <- c(1,2,3,4)
v.x2 <- c("a","a","b","b")
df.x <- data.frame(id = v.x1, item = v.x2)

df.x

> df.x
  id item
1  1    a
2  2    a
3  3    b
4  4    b

df.x <- arrange(df.x, desc(id))
df.x

> df.x <- arrange(df.x, desc(id))
> df.x
  id item
1  4    b
2  3    b
3  2    a
4  1    a


df.x <- arrange(df.x, id)
df.x

> df.x <- arrange(df.x, id)
> df.x
  id item
1  1    a
2  2    a
3  3    b
4  4    b

R 列名を変更する(rename)

【目的】 列名を変更する
【方法】 rename(df, after = before)
【補足】 library(dplyr)が必要

#テスト用データフレーム作成
v.x1 <- c(1,2,3,4)
v.x2 <- c("a","a","b","b")
df.x <- data.frame(id = v.x1, item = v.x2)

df.x

> df.x
  id item
1  1    a
2  2    a
3  3    b
4  4    b

rename(df.x, id2 = id)

> rename(df.x, id2 = id)
  id2 item
1   1    a
2   2    a
3   3    b
4   4    b

R 指定した列を選択(select)

【目的】 指定した列を抽出する
【方法】 select(df, v1, v2)
【補足】 library(dplyr)が必要

#テスト用データフレーム作成

v.x1 <- c(1,2,3,4)
v.x2 <- c("a","a","b","b")
df.x <- data.frame(id = v.x1, item = v.x2)

df.x

> df.x
  id item
1  1    a
2  2    a
3  3    b
4  4    b

select(df.x, id)
> select(df.x, id)
  id
1  1
2  2
3  3
4  4

R 条件に合うデータを抽出する(filter)

【目的】 条件に合うデータを抽出する
【方法】 filter(df, v == 0 )
【補足】 library(dplyr)が必要

 #テスト用データフレーム作成

v.x1 <- c(1,2,3,4)
v.x2 <- c("a","a","b","b")
df.x <- data.frame(id = v.x1, item = v.x2)

df.x

> df.x
  id item
1  1    a
2  2    a
3  3    b
4  4    b

filter(df.x, item == "a")

> filter(df.x, item == "a")
  id item
1  1    a
2  2    a

2015年8月20日木曜日

データ分析役立ちリンク


  • Rと樹木モデル
methodのオプションなど丁寧に説明されていて分かりやすい
http://www1.doshisha.ac.jp/~mjin/R/19.html

  • R と Treasure Data で Web サーバのアクセスログ解析
RからTDに接続する方法が紹介
http://hiratake55.hatenablog.com/entry/2013/12/05/210813

  • Rのグラフィックスパラメータ
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/53.html


  • Kibanaでログ分析を1年続けてみたら業務システムの保守と運用が捗った
  • Kibanaでできることの概観を知るのに役立つ
    https://speakerdeck.com/exoego/how-and-why-i-have-been-leveraging-kibana-for-devops

    • ビックデータ時代のログ収集管理ツールFluentdのインストールと使い方
    上記について分かりやすく説明されている
    http://oxynotes.com/?p=7596


    2015年7月7日火曜日

    R 列名を変える(rename)

    【目的】 列名を変える
    【方法】 filter(df, 変更後列名 = 変更前列名)
    【補足】 library(dplyr)が必要

    library(dplyr)

    #テスト用データフレームを作成

    v.x <- c(1,2,3,4)
    v.x1 <- c("x","a","a","a")
    v.x2 <- c("11","11","11","11")
    df.x <- data.frame(id = v.x, name = v.x1, num = v.x2)

    df.x

    > df.x
      id name num
    1  1    x  11
    2  2    a  11
    3  3    a  11
    4  4    a  11

    rename(df.x, id2 = id)

    > rename(df.x, id2 = id)
      id2 name num
    1   1    x  11
    2   2    a  11
    3   3    a  11
    4   4    a  11

    renameの参考サイト
    http://www.cookbook-r.com/Manipulating_data/Renaming_columns_in_a_data_frame/

    R 条件を指定して任意の行を抽出(filter)

    【目的】 任意の行を抽出する
    【方法】 filter(df, x == 1)
    【補足】 library(dplyr)が必要

    library(dplyr)

    #テスト用データフレームを作成

    v.x <- c(1,2,3,4)
    v.x1 <- c("x","a","a","a")
    v.x2 <- c("11","11","11","11")
    df.x <- data.frame(id = v.x, name = v.x1, num = v.x2)

    df.x

    > df.x
      id name num
    1  1    x  11
    2  2    a  11
    3  3    a  11
    4  4    a  11

    filter(df.x, name == "a")

    > filter(df.x, name == "a")
      id name num
    1  2    a  11
    2  3    a  11
    3  4    a  11


    filterを使って簡単に移動平均を求める方法
    http://tips-r.blogspot.jp/2015/01/r_1.html

    2015年7月3日金曜日

    R:複数列のユニークデータを抽出する(重複除去)

    【目的】 複数列のユニークデータを抽出する(重複データを除去)
    【方法】 distinct(df, x)
    【補足】 library(dplyr)が必要

    #テスト用データフレームを作成

    v.x <- c(1,2,3,4)
    v.x1 <- c("x","a","a","a")
    v.x2 <- c("11","11","11","11")
    df.x <- data.frame(id = v.x, name = v.x1, num = v.x2)

    df.x

    > df.x
      id name num
    1  1    x  11
    2  2    a  11
    3  3    a  11
    4  4    a  11

    distinct(df.x, name)

    > distinct(df.x, name)
      id name num
    1  1    x  11
    2  2    a  11


    R ユニーク数をカウントする
    http://mototeds.blogspot.jp/2015/06/r_29.html

    2015年6月29日月曜日

    R:複数列のユニーク数をカウントする(重複除去してカウント)

    【目的】 ユニーク数を数える(重複を除去して数える)
    【方法】 n_distinct(v.x)
    【補足】 library(dplyr)が必要

    #テスト用データフレームを作成

    v.x <- c(1,2,3,4)
    v.x1 <- c("x","a","a","a")
    v.x2 <- c("11","11","11","11")
    df.x <- data.frame(id = v.x, name = v.x1, num = v.x2)

    df.x

    > df.x
      id name num
    1  1    x  11
    2  2    a  11
    3  3    a  11
    4  4    a  11
    > 

    df.x %>%
      summarize(id_u = n_distinct(id),name_u = n_distinct(name),num_u = n_distinct(num))

    > df.x %>%
    +   summarize(id_u = n_distinct(id),name_u = n_distinct(name),num_u = n_distinct(num))
      id_u name_u num_u
    1    4      2     1

    R ユニークデータを抽出する
    http://mototeds.blogspot.jp/2015/07/r.html

    2015年6月18日木曜日

    R 内部結合(複数key)

    【目的】 Rで複数キーの内部結合をする
    【方法】 inner_join(df.x, df.y, by = c("key_1", "key_2"))
    【補足】 library(dplyr)が必要

    #テスト用データフレームを作成

    v.x <- c(1,2,3,4)
    v.x1 <- c("x","a","a","a")
    v.x2 <- c("11","12","13","14")

    v.y <- c(1,2,3,40)
    v.y1 <- c("x","a","x","a")
    v.y2 <- c("21","22","23","24")

    df.x <- data.frame(id = v.x, name = v.x1, num = v.x2)
    df.y <- data.frame(id = v.y, name = v.y1, num = v.y2)

    > df.x
      id name num
    1  1    x  11
    2  2    a  12
    3  3    a  13
    4  4    a  14
    > df.y
      id name num
    1  1    x  21
    2  2    a  22
    3  3    x  23
    4 40    a  24

    #inner join
    inner_join(df.x, df.y, by = c("id", "name")) 

    > inner_join(df.x, df.y, by = c("id", "name"))
      id name num.x num.y
    1  1    x    11    21
    2  2    a    12    22

    ---他の結合---
    R 内部結合(inner join)
    R 内部結合(複数key)
    R 外部結合(left join, right join)
    R 完全外部結合(full join)
    R アンチ結合(anti join)

    ---dplyrとは?---
    R dplyrとはなんぞや?大規模データも簡単に処理? ~使い方~

    R アンチ結合(anti join)

    【目的】 Rでアンチ結合(anti join)を使う
    【方法】 anti_join(df.x, df.y, by = "key")
    【補足】 library(dplyr)が必要

    #テスト用データフレームを作成

    v.x <- c(1,2,3)
    v.x1 <- c("a","b","c")

    v.y <- c(1,2,30)
    v.y1 <- c("A","B","C")

    df.x <- data.frame(id = v.x, name = v.x1)
    df.y <- data.frame(id = v.y, name = v.y1)

    > df.x
      id name
    1  1    a
    2  2    b
    3  3    c
    > df.y
      id name
    1  1    A
    2  2    B
    3 30    C

    #anti join
    anti_join(df.x, df.y, by = "id")

    > anti_join(df.x, df.y, by = "id")
      id name
    1  3    c

    ---他の結合---
    R 内部結合(inner join)
    R 内部結合(複数key)
    R 外部結合(left join, right join)
    R 完全外部結合(full join)
    R アンチ結合(anti join)

    ---dplyrとは?---
    R dplyrとはなんぞや?大規模データも簡単に処理? ~使い方~

    R 完全外部結合(full join)

    【目的】 Rで完全会部結合(full join)を使う
    【方法】 full_join(df.x, df.y, by = "key")
    【補足】 library(dplyr)が必要

    # テスト用データフレームを作成
    v.x <- c(1,2,3)
    v.x1 <- c("a","b","c")
    v.y <- c(1,2,30)
    v.y1 <- c("A","B","C")
    df.x <- data.frame(id = v.x, name = v.x1)
    df.y <- data.frame(id = v.y, name = v.y1)

    > df.x
      id name
    1  1    a
    2  2    b
    3  3    c
    > df.y
      id name
    1  1    A
    2  2    B
    3 30    C

    # full join
    full_join(df.x, df.y, by = "id")

    > full_join(df.x, df.y, by = "id")
      id name.x name.y
    1  1      a      A
    2  2      b      B
    3  3      c   <NA>
    4 30   <NA>      C

    ---他の結合---
    R 内部結合(複数key)
    R 外部結合(left join, right join)
    R 完全外部結合(full join)
    R アンチ結合(anti join)

    ---dplyrとは?---
    R dplyrとはなんぞや?大規模データも簡単に処理? ~使い方~

    R 外部結合(left join, right join)

    【目的】 Rで外部結合(left join, right join)を使う
    【方法】 left_join(df.x, df.y, by = "key")
    【補足】 library(dplyr)が必要

    #テスト用データフレームを作成

    v.x <- c(1,2,3)
    v.x1 <- c("a","b","c")

    v.y <- c(1,2,30)
    v.y1 <- c("A","B","C")

    df.x <- data.frame(id = v.x, name = v.x1)
    df.y <- data.frame(id = v.y, name = v.y1)

    > df.x
      id name
    1  1    a
    2  2    b
    3  3    c
    > df.y
      id name
    1  1    A
    2  2    B
    3 30    C

    # left join
    left_join(df.x, df.y, by = "id")

    > left_join(df.x, df.y, by = "id")
      id name.x name.y
    1  1      a      A
    2  2      b      B
    3  3      c   <NA>

    # right join
    right_join(df.x, df.y, by = "id")

    > right_join(df.x, df.y, by = "id")
      id name.x name.y
    1  1      a      A
    2  2      b      B
    3 30   <NA>      C

    ---他の結合---
    R 内部結合(inner join)
    R 内部結合(複数key)
    R 外部結合(left join, right join)
    R 完全外部結合(full join)
    R アンチ結合(anti join)

    ---dplyrとは?---
    R dplyrとはなんぞや?大規模データも簡単に処理? ~使い方~


    R 内部結合(inner join)

    【目的】 Rで内部結合(inner join)を使う
    【方法】 inner_join(df.x, df.y, by = "key")
    【補足】 library(dplyr)が必要

    テスト用のデータフレーム作成

    v.x <- c(1,2,3)
    v.y <- c(10,20,30)

    df.x <- data.frame(id = v.x)
    df.y <- data.frame(id = v.y)

    > df.x
      id
    1  1
    2  2
    3  3

    > df.y
      id
    1 1
    2 2
    3 30 

    inner_join(df.x, df.y, by = "id")

    > inner_join(df.x, df.y, by = "id") 
      id
    1  1
    2  2

    ---他の結合---
    R 内部結合(inner join)
    R 内部結合(複数key)
    R 外部結合(left join, right join)
    R 完全外部結合(full join)
    R アンチ結合(anti join)

    ---dplyrとは?---
    R dplyrとはなんぞや?大規模データも簡単に処理? ~使い方~

    R データフレームを縦に結合

    【目的】 データフレームを縦に結合する
    【方法】 rbind(df.x, df.y)
    【補足】 列名が同じであること

    テスト用のデータフレーム作成

    v.x <- c(1,2,3)
    v.y <- c(10,20,30)

    df.x <- data.frame(id = v.x)
    df.y <- data.frame(id = v.y)

    > df.x
      id
    1  1
    2  2
    3  3

    > df.y
      id
    1 10
    2 20
    3 30 

    df.z <- rbind(df.x, df.y)

    > df.z
      id
    1  1
    2  2
    3  3
    4 10
    5 20
    6 30

    R 複数のデータフレームをたてに連結する

    【目的】 複数のデータフレームをたてに連結
    【方法】 rbind_all(list(df.x, df.y, df.z))
    【補足】 異なる列名もつなげる

    テスト用のデータフレーム作成

    v.x <- c(1,2,3)
    v.y <- c(10,20,30)

    df.x <- data.frame(id = v.x)
    df.y <- data.frame(id = v.y)

    > df.x
      id
    1  1
    2  2
    3  3

    > df.y
      id
    1 10
    2 20
    3 30 

    df.z <- rbind(df.x, df.y)

    > df.z
      id
    1  1
    2  2
    3  3
    4 10
    5 20
    6 30

    rbind_all(list(df.x, df.y, df.z))

    > rbind_all(list(df.x, df.y, df.z))
    Source: local data frame [12 x 1]
    
       id
    1   1
    2   2
    3   3
    4  10
    5  20
    6  30
    7   1
    8   2
    9   3
    10 10
    11 20
    12 30

    列名が異なるデータフレームを用意する

    v.d <- c(1,2,3)
    df.d <- data.frame(d = v.d)

    > df.d
      d
    1  1
    2  2
    3  3

    rbind_all(list(df.x, df.y, df.d))

    > rbind_all(list(df.x, df.y, df.d))
    Source: local data frame [9 x 2]
    
      id  d
    1  1 NA
    2  2 NA
    3  3 NA
    4 10 NA
    5 20 NA
    6 30 NA
    7 NA  1
    8 NA  2
    9 NA  3