R语言学习-dplyr包
2019-12-10 本文已影响0人
米粥的味道
不成系统学习的好处,是会根据所需要的通过检索一个个解决问题,但耽误的时间不一定少;系统学习的缺点就是一开始可能会无聊的坚持不下去。在处理数据时,觉得头疼的数据,其实dplyr包就可以简洁的解决掉,太赞了。
来源于:dplyr 包的强大之处;R语言必学包之dplyr包
主要函数
-select、rename、filter、mutate, transmute、group_by、summarize
选择
select函数
- starts_with(match, ignore.case = TRUE, vars = current_vars()): 列名以前缀开始;
- ends_with(match, ignore.case = TRUE, vars = current_vars()): 列名以后缀结束;
- contains(match, ignore.case = TRUE, vars = current_vars()): 列名中包含指定字符串;
#选取变量名中包含etal的列
select(iris, contains("etal"))
- matches(match, ignore.case = TRUE, vars = current_vars()): 列名匹配正则表达式;
#正则表达式匹配,返回变量名中包含ta的列
select(iris, matches(".ta."))
- num_range(prefix, range, width = NULL, vars = current_vars()): prefix
接受一个前缀, range 接受数字序列; - one_of(…, vars = current_vars()): 列名包含在其中;
- everything(vars = current_vars()): 所有的列名.
rename函数
这里需要注意的是, 我们使用 select 函数则在结果中只会保留选择的列.
如果我们只是需要对特定列进行重命名, 而需要保留原来其他的列, 则可以使用 rename 函数.
iris %>% rename(sp.name = Species)
rename(iris,sp.name = Species)
筛选: filter() 和slice()函数
可以按给定的逻辑条件筛选出符合要求的子数据集;
- filter()
#过滤出cyl == 8的行
filter(mtcars, cyl == 8)
filter(mtcars, cyl < 6)
#过滤出cyl < 6 并且 vs == 1的行
filter(mtcars, cyl < 6 & vs == 1)
filter(mtcars, cyl < 6, vs == 1)
#过滤出cyl < 6 或者 vs == 1的行
filter(mtcars, cyl < 6 | vs == 1)
#过滤出cyl 为4或6的行
filter(mtcars, cyl %in% c(4, 6))
- slice()
slice() 函数通过行号选取数据。
#选取第一行数据
slice(mtcars, 1L)
filter(mtcars, row_number() == 1L)
#选取最后一行数据
slice(mtcars, n())
filter(mtcars, row_number() == n())
#选取第5行到最后一行所有数据
slice(mtcars, 5:n())
filter(mtcars, between(row_number(), 5, n()))
改变列值
mutate 函数会保留修改后的列和修改之前的列,
transmute 函数则会保留修改后的列而丢弃修改之前的列
- 可以用于 mutate 和 transmute 函数还有许多辅助函数:
log(), log2(), log10(): 对值求 log;
lead(), lag(): 返回序列中当前位置前第几个值或后第几个值;
row_number(): 结果等于 rank(ties.method = "first"), 即对于相同的数值的排名按照先后顺序排;
min_rank(): 结果等于 `rank(ties.method = "min"), 即对于相同的数值的排名都取最小的排名;
dense_rank(): 结果类似于 min_rank(), 差别在于填充了由于 min_rank 造成的排名空隙;
percent_rank(): 把 min_rank() 的值转换为 0 到 1 区间;
cume_dist(): 计算比当前值还小的值的比例, 相当于计算 density;
ntile(): 把数据分成若干块, 看每个数据在具体拿一个块;
cumsum(), cummean(), cummin(), cummax(), cumany(), cumall(): 累积地 (cumulative) 计算和 (sum), 均值 (mean), 最小值 (min), 最大值 (max), 任何为真 (any), 所有为真 (all);
na_if(): 把特定地值转换为 NA;
coalesce(): 找出若干列中第一个不为 NA 的值;
if_else(): 向量化的 ifelse 函数的效果.
recode: 把一系列值转换为其他值
case_when: 多条件选择
分割-应用-整合
可以使用 group_by 和 summarize 函数来获得iris每个物种的每一种属性的均值
- 众多的函数可以用于 summarize 函数.
mean(), median(), max(), min(), sd(),
IQR(), mad() 等统计函数.
first(), last(), nth(): 返回第几位的值.
n(): 计算数据的数量, 相当于 length() 函数.
n_distinct(): 计算非重复数据的数量, 相当于 length(unique(x)).
any(), all(): 逻辑计算函数
排序
arrange 函数对数据进行从小到大排序.
desc 函数可以实现从大到小排序
#以cyl和disp联合升序排序
arrange(mtcars, cyl, disp)
#以disp降序排序
arrange(mtcars, desc(disp))
去重: distinct
distinct()用于对输入的tbl进行去重,返回无重复的行
df <- data.frame(
x = sample(10, 100, rep = TRUE),
y = sample(10, 100, rep = TRUE)
)
#以全部两个变量去重,返回去重后的行数
nrow(distinct(df))
nrow(distinct(df, x, y))
#以变量x去重,只返回去重后的x值
distinct(df, x)
#以变量y去重,只返回去重后的y值
distinct(df, y)
#以变量x去重,返回所有变量
distinct(df, x, .keep_all = TRUE)
#以变量y去重,返回所有变量
distinct(df, y, .keep_all = TRUE)
#对变量运算后的结果去重
distinct(df, diff = abs(x - y))