magrittr 包引入了管道操作,能够通过管道将数据从一个函数传给另一个函数,从而用若干函数
构成的管道依次变换你的数据。
例如
x %>% f() %>% g()
依次对数据进行若干操作:先对x 进行f 操作, 接着对结果数据进行g 操作
管道默认将数据传给下一个函数的第1 个参数,且它可以省略。
如
c(1, 3, 4, 5, NA) %>%
mean(na.rm = TRUE)
数据经过管道默认传递给函数的第1 个参数(通常直接省略);若在非第1 个参数处使用该数据,
必须用“.” 代替(绝对不能省略),这使得管道作用更加强大和灵活.
同时用于拼接成字符串给main 参数用于图形标题
c(1, 3, 4, 5) %>%
plot(main = str_c(., collapse=","))
read_csv() 和read_tsv();
专门的欧式: read_csv2() 和read_tsv2();欧式格式数据以“;” 为分隔符,“,” 为小数位.
写出数据到文件:write_csv(), write_tsv(), write_csv2(), write_tsv2()
转化数据类型:parse_number(), parse_logical(), parse_factor()
专门读取Excel 文件,包括同一个工作簿中的不同工作表:
read_excel(): 自动检测xls 或xlsx 文件
read_xls(): 读取xls 文件
read_xlsx(): 读取xlsx 文件
读写Excel 文件好用的包,还有openxlsx
读写SPSS, Stata, SAS 数据:
除了save() 和load() 函数外,以下函数也可以:
write_rds(iris, "my_iris.rds")
dat = read_rds("my_iris.rds")
将大数据存放在远程数据库(远程服务器或本地硬盘),然后建立与R 的连接,再从R 中执行查
询、探索、建模等。
dplyr 是tidyverse 操作数据的最核心包,而dbplyr 包是用于数据库的dplyr 后端,让您能够
操作远程数据库中的数据表,就像它们是内存中的数据框一样。安装dbplyr 包时,还会自动安装DBI
包,它提供了通用的接口,使得能够使用相同的代码与许多不同的数据库连用。
常见的主流数据库软件:SQL Server, MySQL, Oracle 等都能支持,但还需要为其安装特定的驱
动,比如
RMariaDB 包:连接到MySQL 和MariaDB
这里不详细写,因为很少使用。
中文乱码是让很多编程者头痛的问题。
ASCII最通用, 是UTF8与GBK两者之间的交集
UTF8目前具有更加通用的形式
每个读取函数都有自己读入的设置参数
readr 包和rvest 包(爬虫)都提供了函数guess_encoding(),可检测文本和网页的编码
方式;python 有一个chardet 库在检测文件编码方面更强大。
合并行:下方堆叠新行,根据列名匹配列,注意列名相同,否则作为新列(NA 填充);
合并列:右侧拼接新列,根据位置匹配行,行数必须相同。
purrr 包中map_dfr() 和map_dfc() 函数可以在批量读入数据的同时做合并行/合并列。
左连接:left_join(), 保留x 所有行,合并匹配的y 中的列, 没有的使用NA补充
x %>%
left_join(y, by = c("var1"="var2"))
或者多个变量: by=c("var1", "var2")
类似的有
右连接:right_join(), 保留所有的y,
全连接:full_join(), 保留所有的行
内连接:inner_join(), 只保留共有的行
半连接:semi_join(),根据在y 中,来筛选x 中的行。
反连接:anti_join(), 根据不在y 中,来筛选x 中的行
需要批量读取它们,再依次做全连接(做其他连接也是类似的)。reduce() 可以实现先将前两个
表做全连接,再将结果表与第三个表做全连接(更多表就依次这样做下去):
files = list.files("datas/achieves/", pattern = "xlsx", full.names = TRUE)
map(files, read_xlsx) %>%
reduce(full_join, by = " 人名") # 读入并依次做全连接
若还是上述数据,但是在一个工作簿的多个工作表中,批量读取并依次做全连接:
path = "datas/3-5 月业绩.xlsx"
map(excel_sheets(path),~ read_xlsx(path, sheet = .x)) %>%
reduce(full_join, by = " 人名")
intersect(x, y) # 返回x 和y 共同包含的观测;
union(x, y) # 返回x 和y 中所有的(唯一) 观测;
setdiff(x, y) # 返回在x 中但不在y 中的观测。
整洁的数据:是变量为一列, 观测值为一行,组成数据框。
如果不整洁,需要首先重塑数据。
数据重塑主要包括长宽表转化、拆分/合并列。
使用函数tidyr包的 pivot_longer() 和pivot_wider().
宽表的特点是:表比较宽,本来该是‘‘值” 的,却出现在‘‘变量(名)” 中。
用tidyr 包中的pivot_longer() 函数来实现宽表变长表,其基本格式为:
pivot_longer(data, cols, names_to, values_to, values_drop_na, ...)
df %>%
pivot_longer(-var, names_to = "year", values_to = "GDP")
df %>%
pivot_longer(-var,
names_to = c(".value", "child"),
names_sep = "_",
values_drop_na = T
)
df %>%
pivot_longer(everything(),
names_to = c("number", ".value"),
names_pattern = "(.*\\d)(.*)")
用tidyr 包中的pivot_wider() 函数来实现长表变宽表,其基本格式为:
pivot_wider(data, id_cols, names_from, values_from, values_fill, ...)
另外还有若干帮助修复列名的参数:names_prefix, names_sep, names_glue.
df = df %>%
group_by(y) %>%
mutate(n = row_number())
df
用separate() 函数来拆分列,其基本语法为:
** separate(data, col, into, sep, ...)**
用unite() 函数来合并列,其基本语法为:
unite(data, col, sep, ...)
方形化(Rectangling)是将一个深度嵌套的列表(通常来自JSON 或XML)驯服成一个整齐的行 和列的数据集
用dplyr 包实现各种数据操
共有5 种基本数据操作:
根据正则表达式匹配选择列:
df %>%
select(matches("m.*a"))
根据条件(逻辑判断)选择列,例如选择所有数值型的列:
df %>%
select(where(is.numeric))
也可以自定义返回TRUE 或FALSE 的判断函数,支持purrr 风格公式写法。例如,选择列和>3000 的列:
df[, 4:8] %>%
select(where(~ sum(.x, na.rm = TRUE) > 3000))
列是根据被选择的顺序排列
everything() 返回未被选择的所有列,将某一列移到第一列时很方便:
df %>%
select(var5, everything())
用relocate() 函数,将选择的列移到某列之前或之后,基本语法为:
relocate(.data, ..., .before, .after)
例如,将数值列移到name 列的后面:
df %>%
relocate(where(is.numeric), .after = name)
比如,将包含”m’’ 的列名,都拼接上前缀”new_“:
df %>%
rename_with(~ paste0("new_", .x), matches("m"))
函数across() 人如其名,让零个/一个/多个函数穿过所选择的列,即同时对所选择的多列应用若干函数,基本格式为
across(.cols = everything(), .fns = NULL, ..., .names)
across() 支持各种选择列语法,与mutate() 和summarise() 连用,产生非常强大的同时修改/(多种) 汇总多列效果;
across() 也能与group_by(), count() 和distinct() 连用,此时.fns 为NULL,只起选择列的作用。
新组合:
我正在寻找执行以下操作的正确语法(在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
我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#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上找到一
使用Paperclip,我想从这样的URL抓取图像:require'open-uri'user.photo=open(url)问题是我最后得到一个像“open-uri20110915-4852-1o7k5uw”这样的文件名。有什么方法可以更改user.photo上的文件名?作为一个额外的变化,Paperclip将我的文件存储在S3上,所以如果我可以在初始分配中设置我想要的文件名就更好了,这样图像就会上传到正确的S3key。像这样:user.photo=open(url),:filename=>URI.parse(url).path 最佳答案