R语言数据处理篇之高级循环
发布时间:2020-12-14 02:47:58 所属栏目:大数据 来源:网络整理
导读:1 replication rep 函数能把输入的参数重复数次。另一个相关函数replicate 则能调用表达式数次。大多数情况下它们基本相等,只有当使用随机数时才会出现不同。现在,假定生成均匀分布随机数的runif 函数不是矢量化的,那么rep 函数每次都将重复相同的随机数
1 replication
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
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),train = rnorm(1,30,10),bike = rnorm(1,60,5) ) names(time) <- mode_of_transport time }
replicate(5,time_for_commute()) ## bus bike train bus bike ## 21.79452 60.34375 29.05779 45.15100 57.18907 2 遍历列表
# 构建质因数分解列表: prime_factors<-list( two=2,three=3,four=c(2,2),five=5,six=c(2,3),seven=7,eight=c(2,2,nine=c(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 循环来逐个地检查元素,但这种方法有点笨拙: 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 大大简化了这种操作,你无需再用那些陈腔滥调的代码来进行长度和名称检查: 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 # 如果函数的每次返回值大小相同,且你知其大小为多少,那么你可以使用lapply 的变种vapply。vapply 的含义是:应用于(apply)列表而返回向量(vector)。和前面一样,它的输入参数是一个列表和函数,但vapply 还需要第三个参数,即返回值的模板。它不直接返回列表,而是把结果简化为向量或数组: vapply(prime_factors,length,numeric(1)) ## two three four five six seven eight nine ten ## 1 1 2 1 2 1 3 2 2
prime_factors<-list( two=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 # 匿名函数传给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
env<-new.env() env$molien<-c(1,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
3 遍历数组
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 函数将创建一个f 方阵:n×n 的、从1 排到n2 的数字矩阵,其行数和列数相等:(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |