此部分的内容,全部是对张敬信博士书籍的学习总结。
出发点: 因为tidyverse简洁编码,使R代码更加易读。我就想系统再次学习下R,这样让自己写的R代码更加简洁。
关于“for 循环运行速度慢” 的说法,实际上已经过时了,现在的R、Matlab 等软件经过多年的
内部优化已经不慢了,之所以表现出来慢,是因为你没有注意两个关键点:
提前为保存循环结果分配存储空间;
为循环体中涉及的数据选择合适的数据结构。
apply 函数族和purrr 泛函式编程能够更加高效简洁地实现一般的for 循环、while 循环,但这
不代表for 循环、while 循环就没用了,它们可以在更高的层次使用(相对于在逐元素级别使用)### 时间段数据
interval() ##计算两个时间点的时间间隔,返回时间段数据

t %within% gap # 判断t是否属于该时间段

时间点+时间段生成一个新的时间点



ts()是base R生成时间序列的函数,基本格式
ts(data, start = 1, end, frequency=1,...) ## frequency=1是年,4位季节,12是月, 52是周,
as_tsibble()将数据框转为时间序列对象tsibble,只需要指定时间索引和分组索引
library(fpp3)
stocks = as_tsibble(stocks, key = stock, index = Data)
正则表达式,是根据字符串规律按一定法则,简洁表达一组字符串的表达式。
正则表达式包括:只能匹配自身的普通字符(如英文字母、数字、标点等) 和被转义了的特殊字符
(称为‘‘元字符”)

需要创建多行模型的正则表达式




圆括号括起来的表达式最优先,其次是表示重复次数的操作(即* + { }) ;再次是连接运算(即几
个字符放在一起,如abc) ;最后是或者运算(|)
另外,正则表达式还有若干高级用法,常用的有零宽断言和分组捕获,将在下面实例中进行演示。

适合想要匹配的内容没有规律性,但该内容位于两个有规律性的标志之间,标志也可以是开始和
结束。
通常想要匹配的内容不包含两边的‘‘标志’’,这就需要用零宽断言。简单来说,就是一种引导语法
告诉既要匹配到‘‘标志’’,但又不包含‘‘标志’’。左边标志的引导语法是(?<= 标志),右边标志的引导
语法是(?= 标志),而真正要匹配的内容放在它们中间。

正则表达式中可以用圆括号来分组,作用是
编程中的控制结构,是指分支结构和循环结构。
if (条件){
} else if {
} else {
}
另一种对分支写法switch()函数
x = "b"
v = switch(x, "a"="apple", "b"="banana", "c"="cherry")
v
## [1] "banana"
ifelse(x<0, -x, x) ### |x|的简单表达方式

循环,用来处理对多个同类输入做相同事情(即迭代) ,如对向量的每个元素做相同操作,对数据
框不同列做相同操作、对不同数据集做相同操。
R中有三种方式实现循环:
关于“for 循环运行速度慢” 的说法,实际上已经过时了,现在的R、Matlab 等软件经过多年的
内部优化已经不慢了,之所以表现出来慢,是因为你没有注意两个关键点:
apply 函数族和purrr 泛函式编程能够更加高效简洁地实现一般的for 循环、while 循环,但这不代表for 循环、while 循环就没用了,它们可以在更高的层次使用(相对于在逐元素级别使用)。
df = as_tibble(iris[,1:4]) ### 给出数据
output = vector("double", 4)#### 准备好输出的空间
for (i in 1:4) { ### 迭代
output[i] = mean(df[[i]]) ### 循环体
}
for (i in seq_along(x)) {
name = names(x)[i]
value = x[i]
}
不要‘每循环一次,就做一次拼接’’
先将结果保存为列表,等循环结束再将列表unlist() 或purrr::flatten_dbl()成一个向量。
output = list() # output = NULL 也行
# output = vector("list", 3)
for(i in 1:3) {
output[[i]] = c(i, i^2)
}
另外两种类似的情形是:
while (condition) {
# 循环体
}
注意,repeat 循环至少会执行一次。
repeat{
# 循环体
if(退出条件) break
}
注意:建议弃用apply 函数族,直接用purrr::map 系列。
基本格式:
apply(x, MARGIN, FUN, ...)
该函数可以按照因子分组计算分组统计:tapply(var1, var2, FUN)
lapply(x, FUN, ...)
sapply(x, FUN, simplify = TRUE, ...)
相对于apply 族,purrr 泛函式编程提供了更多的一致性、规范性和便利性,更容易记住和使用。
需要知道: 循环迭代, 泛函式编程(函数包含其他函数作为参数):
map(x, FUN)
map(.x, .f, ...)
map_*(.x, .f, ...)
map() 返回结果列表,基本同lapply()。例如,计算前文df,每列的均值,即依次将mean() 函数,应用到第1 列,第2 列,. . . ;并控制返回结果为double 向量:
map(df, mean)
或者
map_dbl(df, mean) # better
另外,mean() 函数还有其他参数,如na.rm,若上述计算过程需要设置忽略缺失值,只需:
map_dbl(df, mean, na.rm = TRUE) # 数据不含NA, 故结果同上(略)
map_dbl(df, ~mean(.x, na.rm = TRUE)) # purrr 风格公式写法
有了map() 函数,对于自定义只接受标量的一元函数,比如f(x), 想要让它支持接受向量作为输
入,根本不需要改造原函数,只需:
map_*(xs, f) # xs 表示若干个x 构成的序列
map2(.x, .y .f, ...)
map2_*(.x, .y, .f, ...)
map2_dbl(height, weight, ~ .y / .x^2)
类似的:
map2_*(xs, ys, f) # xs, ys 分别表示若干个x, y 构成的序列
pmap(.l, .f, ...)
pmap_*(.l, .f, ...)
pmap_*() 提供了一种行化操作数据框的办法。
按 行求均值
pmap_dbl(df, ~ mean(c(...)))
函数名= function(输入1, ..., 输入n) {
函数体
return(返回值) ### 非必须,默认最后一行的值为返回值
}
输入有几个,分别是什么,适合用什么数据类型存放;
输出有几个,分别是什么,适合用什么数据类型存放。
scores = c(35, 67, 100)
map_chr(scores, Score_Conv)
具有多个矩阵函数
nrow(A) # 返回矩阵A 的行数
ncol(A) # 返回矩阵A 的列数
dim(A) # 返回矩阵x 的维数(几行× 几列)
colSums(A) # 对矩阵A 的各列求和
rowSums(A) # 对矩阵A 的各行求和
colMeans(A) # 对矩阵A 的各列求均值
rowMeans(A) # 对矩阵A 的各行求均值
t(A) # 对矩阵A 转置
det(A) # 计算方阵A 的行列式
crossprod(A, B) # 计算矩阵A 与B 的内积, t(A) %*% B
outer(A, B) # 计算矩阵的外积(叉积) , A %o% B
diag(x) # 取矩阵对角线元素,或根据向量生成对角矩阵
diag(n) # 生成n 阶单位矩阵
solve(A) # 求逆矩阵(要求矩阵可逆)
solve(A, B) # 解线性方程组AX=B
ginv(A) # 求矩阵A 的广义逆(Moore-Penrose 逆)
eigen() # 返回矩阵的特征值与特征向量(列)
kronecker(A, B) # 计算矩阵A 与B 的Kronecker 积
svd(A) # 对矩阵A 做奇异值分解,A=UDV'
qr(A) # 对矩阵A 做QR 分解: A=QR, Q 为酉矩阵, R 为阶梯形矩阵
chol(A) # 对正定矩阵A 做Choleski 分解, A=P'P,P 为上三角矩阵
A[upper.tri(A)] # 提取矩阵A 的上三角矩阵
A[lower.tri(A)] # 提取矩阵A 的下三角矩阵
factorial(n) # 计算n 的阶乘
choose(n, k) # 计算组合数
gamma(x) # Gamma 函数
beta(a, b) # beta 函数
combn(x, m) # 生成x 中任取m 个元的所有组合, x 为向量或整数n
R 中,常用的概率函数有密度函数、分布函数、分位数函数、生成随机数函数,其写法为:
d = 密度函数(density)
p = 分布函数(distribution)
q = 分位数函数(quantile)
r = 生成随机数(random)
上述4 个字母+ 分布缩写,就构成通常的概率函数,例如:
sample() 函数,用来从向量中重复或非重复地随机抽样,基本格式为:
sample(x, size, replace = FALSE, prob)
states::lag()
lag(x, k, ...)
diff() 函数,用来计算时间序列的差分,基本格式为:
diff(x, lag = 1, difference = 1, ...)
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我的Rails应用程序中安装了carrierwave。但是,当用户上传多页pdf时,我只希望应用程序获取文档中的第一页并将其转换为jpeg。这可能吗?用什么命令?这是我的uploader。#encoding:utf-8classImageUploader[200,300]##defscale(width,height)##dosomething#end#Createdifferentversionsofyouruploadedfiles:version:thumbdoprocess:resize_to_fill=>[150,210]process:convert=>:jpgdefful
我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。
有没有办法跳过CSV文件的第一行,让第二行作为标题?我有一个CSV文件,第一行是日期,第二行是标题,所以我需要能够在遍历它时跳过第一行。我尝试使用slice但它会将CSV转换为数组,我真的很想将其读取为CSV,以便我可以利用header。 最佳答案 根据您的数据,您可以使用另一种方法和skip_lines-option此示例跳过所有以#开头的行require'csv'CSV.parse(DATA.read,:col_sep=>';',:headers=>true,:skip_lines=>/^#/#Markcomments!)do|
我正在查看Ruby日志记录库Logging.logger方法并从sourceatgithub提出问题与这段代码有关:logger=::Logging::Logger.new(name)logger.add_appendersappenderlogger.additive=falseclass我知道类 最佳答案 这实际上删除了方法(当它实际被执行时)。这是确保close不会被调用两次的保障措施。看起来好像有嵌套的“class 关于Ruby元编程问题,我们在StackOverflow上找到一