注目の投稿

【kepler.gl】コロナ対策による人流の変化も地図上に可視化(各種メディアで報道)

kepler.glのサイト画面 kepler.glを使ってコロナ対策の効果を分析したところ、テレビ、新聞、ネットのメディアから問い合わせや報道依頼が殺到。今も、土日返上で都内や全国の人流変化を分析しています。この記事では人流変化の可視化に便利なkepler.glにつ...

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