2016年2月22日 星期一
Cran R 與 Microsoft R Open 效能比較
語法如下:
set.seed (1)
m <- 10000="" br="">n <- 5000="" br="" nbsp="">A <- br="" m="" matrix="" n="" runif=""># Matrix multiply
system.time (B <- crossprod="" p="">
結果:
Cran R
user system elapsed
203.78 0.19 204.95
MRO
user system elapsed
18.08 0.04 18.59
快了將近 10 倍有。
參考網站:
https://mran.revolutionanalytics.com/documents/rro/multithread/#mt-bench->->->->
2015年12月21日 星期一
SAS 的 Data step 與 Proc SQL
文獻1:Malachy J. Foley. "MERGING vs. JOINING: Comparing the DATA Step with SQL" SUGI 30.
![]() |
| 圖一 |
data step merge
... ...
MERGE one (IN=in1) two (IN=in2); BY id ;
IF 條件設定;
RUN;
重點摘要:
- 各個資料檔的主 id 沒有重覆, Match-merge的情況下 data step merge 與 SQL JOIN可以有相同的產出。data step merge 的各種條件設定,與相對應的 SQL JOIN 說明如下:
ABC區 IF in1 = 1 or in2 = 1; 相當於 SQL 的 FULL OUTER JOIN。
AB 區 IF in1 = 1 ; 相當於 SQL 的 LEFT OUTER JOIN。
BC 區 IF in2 = 1; 相當於 SQL 的 RIGHT OUTER JOIN。
B 區 IF in1 = 1 AND in2 = 1; 相當於 SQL 的 INNER JOIN。
- SQL JOIN 主要分二類:INNER、OUTER,其執行機制來於 CARTESIAN PRODUCT。 OUTER JOIN 又可分三類 FULL OUTER JOIN、LEFT OUTER JOIN、RIGHT OUTER JOIN,在寫程式時, OUTER 這個字可以省略(如 FULL JOIN)。
- CARTESIAN PRODUCT (圖二)沒有 ON key-field-condition
基本上如果 one 有3筆,two有2筆,three有2筆,其結果就是 3 * 2 * 2 = 12筆
以SQL來寫,
PROC SQL;
CREATE TABLE allrecord AS
SELECT *
FROM one, two, three
;
QUIT;
![]() |
| 圖二 |
- INNER JOIN的兩種寫法(概念如圖一),有 ON key-field-condition
PROC SQL;
CREATE TABLE both AS
SELECT *
FROM one INNER JOIN two
ON one.id = two.id
QUIT;
PROC SQL;
CREATE TABLE both AS
SELECT *
FROM one, two
WHERE one.id = two.id
QUIT; - OUTER JOIN 也是有 ON key-field-condition,主 key 最好要另加上coalesce () ,如:SELECT coalesce (one.id , two.id) AS new_id。
- 若只要 A 區(有 one但不含 two)
SQL可用
LEFT JOIN ... ...
ON ... ...
WHERE two.id IS NULL
data step 可用 IF in1 = 1 AND in2 = 0;
若只要 C 區(有 two但不含 one)
SQL可用
RIGHT JOIN ... ...
ON ... ...
WHERE one.id IS NULL
data step 可用 IF in1 = 0 AND in2 = 1;
若只要 AC 區(排除 B,即排除one與 two的聯集)
SQL可用
FULL OUTER JOIN ... ...
ON ... ...
WHERE one.id IS NULL OR two.id IS NULL
data step 可用 IF in1 + in2 = 1;
文章最後有用 data step 作 CARTESIAN PRODUCT 的範例,如下
DATA CART ;
SET one (rename=(ID=ID1));
DO i=1 TO kkk;
SET two point=i nobs=kkk; OUTPUT;
END;
RUN;
原則上就是分兩次 SET,並且在第2次時,搭配 do-output-end,最重要的還有 point 與 nobs 的指令,我猜似它的用途為
1、nobs 得到 two 有幾筆資料,並匯到 變項 kkk裡,而 kkk剛好告訴 DO loop 何時要停整。
2、point 很重要的,但無解,不懂。
2015年3月4日 星期三
Subseting
Subseting Matrix
[列,欄] 或 [列名,欄名]
預設結果為vector。
> x <- matrix(1:6, 2, 3)
> dimnames(x)<- list(c("1st", "2nd") ,c("C1", "C2" , "C3") )
> x[1, ]
C1 C2 C3
1 3 5
> x["1st",]
C1 C2 C3
1 3 5
> x[1, , drop=FALSE]
C1 C2 C3
1st 1 3 5
不可用 $欄名 ,$列名
Subseting Data.frame
[列,欄] , ["列名","欄名"] , $欄名 ,$列名,
預設結果為 vector。
以下都是 [1] 5 6
> x2<- data.frame(x) #**轉成 tabular **
x2[,3]
x2[,"C3"]
x2$C3
簡寫版 [ 欄 ] 或 [ "欄名" ]
結果是 data.frame
> x2[3]
> x2["C3"]
C3
1st 5
2nd 6
但是, [[ 欄 ]] 或 [[ "欄名" ]] 就可以轉成 vector
x2[[3]]
x2[["C3"]]
Subseting List
[ 序位 ] 或 [ "名稱" ]
結果是 list
$foo
[1] 1 2 3 4
x <- list(foo = 1:4, bar = 0.6)
attributes(x)
class(x)
x[1]
x["foo"]
[[ 序位 ]] 或 [[ "名稱" ]] 或 $名稱
結果都是vector
[1] 1 2 3 4
x$foo
x[[1]]
x[["foo"]]
簡寫版,給開頭名稱就可 x[["f", exact=FALSE]]
[[ 第 n 元素 ]] [第 i 個]
結果都是vector
> x[[1]][2]
[1] 2
所有元素的第 i 個,要寫function
> secondElement <- function(x){x[1]}
> sapply(x,secondElement)
foo bar baz
"1" "0.6" "hello"
由 Data.frame 轉成 List
按月就有一個元素,元素裡是dataframe
library(datasets)
head(airquality)
s <- split(airquality, airquality$Month)
s[[1]][1] 結果是dataframe
s[[1]][[1]] 結果是 vector
Subseting
jsonData$name=="datasharing"
[1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE [25] FALSE FALSE FALSE FALSE FALSE FALSE
jsonData[jsonData$name=="datasharing", ]$createdat
[[1]]
[1] "2013-11-07T13:25:07Z"
jsonData[with(jsonData, name=="datasharing" ), "createdat" ]
[[1]]
[1] "2013-11-07T13:25:07Z"
jsonData[with(jsonData, name=="datasharing" ), 45 ]
[[1]]
[1] "2013-11-07T13:25:07Z"
Removing NA Values
is.na() 用於單個變項
nrow(airquality) # 153
air2<-airquality[!is.na(airquality[[1]]),]
nrow(air2) # 116 筆 第1欄無NA
complete.cases() 用於整個資料檔
air3<-airquality[complete.cases(airquality),]
nrow(air3) # 111筆 完整的資料
多個資料檔同時check,要注意資料量相同
Ozone<-airquality[[1]]
Solar.R<-airquality[[2]]
Wind<-airquality[[3]]
sum( is.na(Ozone) | is.na(Solar.R) | is.na(Wind) )
[1] 3檔案中,共 42 筆有任一NA, 即 111筆完整資料
good<-complete.cases(Ozone,Solar.R,Wind)
sum(good)
[1] 111 筆完整資料
sum(!good)
[1] 42 筆有任一NA
簡例
指標的平均值,按月份
以Tapply,每月 1 個指標,結果為array
tapply(airquality[,"Ozone"], airquality$Month, function(x){mean(x, na.rm=TRUE)}
)
5 6 7 8 9
23.61538 29.44444 59.11538 59.96154 31.44828
以split 與 lapply,每個月可 N 個指標,結果為list
s <- split(airquality, airquality$Month)
lapply(s, function(x){
colMeans( x[, c("Ozone", "Solar.R", "Wind")], na.rm=TRUE )}
)
$`5`
Ozone Solar.R Wind
23.61538 181.29630 11.62258
$`6`
Ozone Solar.R Wind
29.44444 190.16667 10.26667

