99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀R語言數(shù)據(jù)處理篇之高級循環(huán)
R語言數(shù)據(jù)處理篇之高級循環(huán)
2018-03-18
收藏

R語言數(shù)據(jù)處理篇之高級循環(huán)

1 replication
    rep 函數(shù)能把輸入的參數(shù)重復(fù)數(shù)次。另一個相關(guān)函數(shù)replicate 則能調(diào)用表達(dá)式數(shù)次。大多數(shù)情況下它們基本相等,只有當(dāng)使用隨機(jī)數(shù)時才會出現(xiàn)不同?,F(xiàn)在,假定生成均勻分布隨機(jī)數(shù)的runif 函數(shù)不是矢量化的,那么rep 函數(shù)每次都將重復(fù)相同的隨機(jī)數(shù),而replicate 每次的結(jié)果都不相同(由于歷史的原因,其參數(shù)順序竟然是從后到前的,這有點(diǎn)煩人):
rep(runif(1),5)

## [1] 0.3322252 0.3322252 0.3322252 0.3322252 0.3322252

replicate(5,runif(1))

## [1] 0.283310499 0.008578707 0.146623782 0.415137337 0.338364811

    在更為復(fù)雜的例子中,replicate 會大顯身手。例如,在蒙特卡羅(Monte Carlo)分析中——replicate 最主要的用途,你需要重復(fù)固定次數(shù)的分析過程且每次迭代都是相互獨(dú)立的。
    下一個例子將分析某人上下班時使用不同交通工具所花費(fèi)的時間。這有些復(fù)雜,不過這是為了展示replicate 的作用,它非常適合于這種場景。
    time_for_commute 函數(shù)用sample 隨機(jī)挑選一種交通工具(小汽車、公交車或自行車),然后用rnorm 或rlnorm 找到一個正態(tài)分布或?qū)?shù)正態(tài)分布1 的行程時間(具體參數(shù)取決于所選的交通工具)。

time_for_commute <- function()
{
  mode_of_transport <- sample(
  c("car", "bus", "train", "bike"),
  size = 1,
  prob = c(0.1, 0.2, 0.3, 0.4)
  )
time <- switch(
  mode_of_transport,
  car = rlnorm(1, log(30), 0.5),
  bus = rlnorm(1, log(40), 0.5),
  train = rnorm(1, 30, 10),
  bike = rnorm(1, 60, 5)
  )
names(time) <- mode_of_transport
time
}

    switch 語句的存在使得這個函數(shù)很難被向量化。這意味著:為了找到上下班時間的分布,我們需要多次調(diào)用time_for_commute 來生成每天的數(shù)據(jù)。replicate 使我們能即刻進(jìn)行向量化:

replicate(5,time_for_commute())

##      bus     bike    train      bus     bike
## 21.79452 60.34375 29.05779 45.15100 57.18907

2 遍歷列表

    現(xiàn)在,你已經(jīng)注意到向量化在R 中無處不在。事實(shí)上,你會很自然地選擇編寫向量化代碼。因?yàn)樗勾a看上去更精簡,且與循環(huán)相比它的性能更好。不過,在某些情況下,保持矢量化意味著控制代碼的方式不太自然。此時,apply 系列的函數(shù)能更自然地讓你進(jìn)行“偽矢量化”2。
    最簡單且常用的成員函數(shù)是lapply,它是“l(fā)ist apply”的縮寫。lapply 的輸入?yún)?shù)是某個函數(shù),此函數(shù)將依次作用于列表中的每個元素上,并將結(jié)果返回到另一個列表中。

# 構(gòu)建質(zhì)因數(shù)分解列表:
prime_factors<-list(
  two=2,
  three=3,
  four=c(2,2),
  five=5,
  six=c(2,3),
  seven=7,
  eight=c(2,2,2),
  nine=c(3,3),
  ten=c(2,5)
  )
head(prime_factors)

## $two
## [1] 2
##
## $three
## [1] 3
##
## $four
## [1] 2 2
##
## $five
## [1] 5
##
## $six
## [1] 2 3
##
## $seven
## [1] 7

# 以向量化的方式在每個列表元素中搜索唯一值是很難做到的。我們可以寫一個for 循環(huán)來逐個地檢查元素,但這種方法有點(diǎn)笨拙:
unique_primes<-vector("list",length(prime_factors))
for(i in seq_along(prime_factors))
  {
  unique_primes[[i]]<-unique(prime_factors[[i]])
  }
names(unique_primes)<-names(prime_factors)
unique_primes

## $two
## [1] 2
##
## $three
## [1] 3
##
## $four
## [1] 2
##
## $five
## [1] 5
##
## $six
## [1] 2 3
##
## $seven
## [1] 7
##
## $eight
## [1] 2
##
## $nine
## [1] 3
##
## $ten
## [1] 2 5

# lapply 大大簡化了這種操作,你無需再用那些陳腔濫調(diào)的代碼來進(jìn)行長度和名稱檢查:
lapply(prime_factors,unique)

## $two
## [1] 2
##
## $three
## [1] 3
##
## $four
## [1] 2
##
## $five
## [1] 5
##
## $six
## [1] 2 3
##
## $seven
## [1] 7
##
## $eight
## [1] 2
##
## $nine
## [1] 3
##
## $ten
## [1] 2 5

# 如果函數(shù)的每次返回值大小相同,且你知其大小為多少,那么你可以使用lapply 的變種vapply。vapply 的含義是:應(yīng)用于(apply)列表而返回向量(vector)。和前面一樣,它的輸入?yún)?shù)是一個列表和函數(shù),但vapply 還需要第三個參數(shù),即返回值的模板。它不直接返回列表,而是把結(jié)果簡化為向量或數(shù)組:
vapply(prime_factors,length,numeric(1))

##   two three  four  five   six seven eight  nine   ten
##     1     1     2     1     2     1     3     2     2
    如果輸出不能匹配模板,那么vapply 將拋出一個錯誤——vapply 不如lapply 靈活,因?yàn)樗敵龅拿總€元素必須大小相同且必須事先就知道。
    還有一種介于lapply 和vapply 之間的函數(shù)sapply,其含義為:簡化(simplfy)列表應(yīng)用。與其他兩個函數(shù)類似,sapply 的輸入?yún)?shù)也是一個列表和函數(shù)。它不需要模板,但它會盡可能地把結(jié)果簡化到一個合適的向量和數(shù)組中。
prime_factors<-list(
  two=2,
  three=3,
  four=c(2,2),
  five=5,
  six=c(2,3),
  seven=7,
  eight=c(2,2,2),
  nine=c(3,3),
  ten=c(2,5)
  )
sapply(prime_factors,unique)

## $two
## [1] 2
##
## $three
## [1] 3
##
## $four
## [1] 2
##
## $five
## [1] 5
##
## $six
## [1] 2 3
##
## $seven
## [1] 7
##
## $eight
## [1] 2
##
## $nine
## [1] 3
##
## $ten
## [1] 2 5

sapply(prime_factors,length)

##   two three  four  five   six seven eight  nine   ten
##     1     1     2     1     2     1     3     2     2

sapply(prime_factors,summary)

##         two three four five  six seven eight nine  ten
## Min.      2     3    2    5 2.00     7     2    3 2.00
## 1st Qu.   2     3    2    5 2.25     7     2    3 2.75
## Median    2     3    2    5 2.50     7     2    3 3.50
## Mean      2     3    2    5 2.50     7     2    3 3.50
## 3rd Qu.   2     3    2    5 2.75     7     2    3 4.25
## Max.      2     3    2    5 3.00     7     2    3 5.00

# 匿名函數(shù)傳給lapply
complemented <- c(2, 3, 6, 18)
lapply(complemented,rep.int,times=4)

## [[1]]
## [1] 2 2 2 2
##
## [[2]]
## [1] 3 3 3 3
##
## [[3]]
## [1] 6 6 6 6
##
## [[4]]
## [1] 18 18 18 18

lapply(complemented,function(x) rep.int(4,time=x))

## [[1]]
## [1] 4 4
##
## [[2]]
## [1] 4 4 4
##
## [[3]]
## [1] 4 4 4 4 4 4
##
## [[4]]
##  [1] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4

    在極個別的情況下,你可能需要循環(huán)遍歷環(huán)境(而非列表)中每個變量。對此,你可以使用專門的函數(shù)eapply。當(dāng)然,在最新版本的R 中,你也可以使用lapply:
env<-new.env()
env$molien<-c(1,0,1,0,1,1,2,1,3)
env$larry<-c("Really","leery","rarely","Larry")
eapply(env,length)

## $molien
## [1] 9
##
## $larry
## [1] 4

lapply(env,length)

## $molien
## [1] 9
##
## $larry
## [1] 4
    rapply 是lapply 函數(shù)的遞歸版本,它允許你循環(huán)遍歷嵌套列表。這是個特殊的要求,且如果事先使用unlist 將數(shù)據(jù)扁平化就會使代碼變得更簡單。
3 遍歷數(shù)組
    lapply 和它的小伙伴vapply 與sapply 都可用于矩陣和數(shù)組上,但它們的行為往往不是我們想要的。這三個函數(shù)把矩陣和數(shù)組看作向量,將目標(biāo)函數(shù)作用于每個元素上(沿列往下移動)。而更為常見的是,當(dāng)要把函數(shù)作用于一個數(shù)組時,我們希望能按行或列應(yīng)用它們。下面的例子使用matlab 包,提供了對手語言所具備的功能。

library(matlab)

##
## Attaching package: 'matlab'
##
## The following object is masked from 'package:stats':
##
##     reshape
##
## The following objects are masked from 'package:utils':
##
##     find, fix
##
## The following object is masked from 'package:base':
##
##     sum

(magic4<-magic(4))

##      [,1] [,2] [,3] [,4]
## [1,]   16    2    3   13
## [2,]    5   11   10    8
## [3,]    9    7    6   12
## [4,]    4   14   15    1

magic 函數(shù)將創(chuàng)建一個f 方陣:n×n 的、從1 排到n2 的數(shù)字矩陣,其行數(shù)和列數(shù)相等:

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }