R包dplyr——数据处理必备神器
-
%>%
管道符传递变量,简洁代码。
- 用法:
df %>% select(mpg,wt)->df1
,运行一下,看看是不是选择了 df 中的,mpg,wt 两列呢,并且我们将结果赋值给了变量 df1 - 作用 1:将 df,传递到 select 函数中的第一个位置,事实上,我们还可以通过"."作为占位符,来将 df 放到任意位置。
比如df%>%select(mpg,wt,.)
,注意看,wt 后面有一个点,当然这条语句是不能正常运行的,我只是想告诉大家,通过“点”作为占位符,可以将上一个结果,放到下一个管道中的任意位置。 - 作用 2:有没有发现用了管道符之后,我们再次使用列名 mpg 的时候,便不需要使用 df$mpg 了呢,没错,它的另外一个功能就是类似于 attach,数据绑定的功能,使用管道符,能让我们的代码更加简洁。
- 用法:
-
select()
筛选列
用列名进行筛选。
- 巧用以下符号
":"
该符号表示用于选择一系列的变量。"!"
:表示取反操作的,类似于在 df 中不选择某列,比如 df[,-1],表示不选择第一列"&"
:表示逻辑运算符“与”,表示“且”的意思。A&B,表示满足条件 A,且满足条件 B"|"
:表示逻辑运算符“或”,表示“或”的意思。A|B,表示满足条件 A 或者满足条件 B 就可以了,通常具有短路操作。"c()"
:就是表示列的组合,其实就是向量,元素可为数字或者字符串。"-"
:去除- 下面还有几个比较重要的函数,可以作为 select 选择列的参数来使用。
last_col()
: 表示选择最后一列。starts_with()
:表示以什么开头的列。ends_with()
:表示以什么结尾的列。contains()
:表示某列是否包含什么内容。one_of()
:选择字符向量中的列,select中不能直接使用字符向量筛选,需要使用one_of函数.everything
:一般用于调整列顺序,把a列放到最前面
select(iris, a, everything())
- 例子:
- 选择 df 中的第一列到第五列。
用法:select(df,1:5)或者select(df,c(1,2,3,4,5))
- 选择 df 中的 mpg 到 wt 之间的所有列,包括(mpg,wt)
用法:select(df,"mpg":"wt")
- 选择某些列以"d"开头,或者以"p"结尾的。
用法:select(df,starts_with("d")|ends_with("p"))
- 选择某些列以"d"开头,且以"t"结尾的。
用法:select(df,starts_with("d")&ends_with("t"))
- 选择以"d"开头,且包含"s"的列。
用法:select(df,starts_with("d")&contains("s"))
- 选择不以"d"开头,且以"p"结尾的列.
用法:select(df,!(starts_with("d"))&(ends_with("p")))
- 选择向量里的字符串变量名 :
vars <- c("A", "B") select(iris, one_of(vars))
- 返回指定字符向量之外的列 "-" :
select(iris, - one_of(vars))
- 选择 df 中的第一列到第五列。
-
rename()
重命名 给定列
保留所有的列,只对给定的列重新命名。原数据集行名称会被过滤掉。
rename(data,new_name= old_name)
#重命名列Petal.Length,返回子数据集只包含重命名的列
select(iris, petal_length = Petal.Length)
#重命名所有以Petal为前缀的列,返回子数据集只包含重命名的列
select(iris, petal = starts_with("Petal"))
#重命名列Petal.Length,返回全部列
rename(iris, petal_length = Petal.Length)
-
filter()
/slice()
筛选行 -
slice()
函数通过行号选取数据。 -
filter()
通过逻辑运算筛选。==, >, >= etc
&, |, !, xor()
is.na()
-
between(), near()
- between(x,a,b):假设 x 是一个数值型向量,该函数判断 x 中元素是否(>=a)&(<=b),返回一个逻辑型向量。
- 例子:
- 选择 df 中,hp 列大于等于 110,小于等于 150 的行,且 gear 列等于 4。filter(df,between(df$hp,110,150)&(df["gear"]==4))
- 选择 df 中,hp 列大于 disp 列的行。
filter(df,df["hp"]>df["disp"])
#选取第一行数据
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()))
-
默认是升序,如需降序,则使用 desc()函数。arrange()排序
- 使 df 按照 mpg 列升序排列,wt 列,升序排列。
arrange(df,"mpg","wt")
- 使 df 按照 mpg 列升序排列,wt 列,降序排列。
arrange(df,"mpg",desc("wt"))
- 使 df 按照 mpg 列升序排列,wt 列,升序排列。
-
mutate () 列计算/变形
mutate():产生新的列,保留旧的列。
新变量名 ,计算并赋值给变量名
transmute()只返回扩展的新变量。原数据集行名称会被过滤掉。
df%>%
select(cyl,gear,wt)%>%
mutate(cyl2=cyl*2,gear4=gear*4,
wt=NULL #将值设置为NULL,可将这列删除
)%>%
head()
##cyl 和 gear 还在
## 新增列的位置:.before | .after
#假如想指定这些新增加的列放在哪个列之前或者之后,使用 .before=原来df中的某个列名,可以将新增加列,放在原来的那个列名前面,注意before参数前面有个点!!,.after表示放在某个列之后。
-
summarise()
对数据框或者分组变量进行统计性描述。
常用结合函数
- Center: mean(),median()
- Spread:sd(), IQR() , mad()
- Range:min() ,max(), quantile()
- Position: first(), last(), nth()
- Count: n() ,n_distinct()
- Logical :any() ,all()
-
quantile()
:- 默认返回四分位(0,0.25(Q1),0.5(Q2),0.75(Q3),1)- quantile(1:10,c(0.25,0.75))#第二个参数控制 分位值
-
IQR ()
: 四分位间距- IQR(1:10 ) >IQR =Q3-Q1 =7.75-3.25=4.5
-
median()
:中位数 Q2 -
nth( )
: 表示抽取向量中哪一个位置的元素- 比如 nth(c(1,5,2),2)抽取的是第二个位置的,返回 5,还可以通过负号,来表示抽取倒数第几个,比如 nth(c(1,5,2),-3),表示抽取倒数第三个,就是 1
-
n( )
:
- 返回当前分组或者变量的信息,通常是计数,通常用在特定函数,比如 summarize,mutate 中。 -
n_distinct()
: 去重后,再计数。 -
first()
,last()
:
- 参数可以为一个向量,分别返回向量的第一个值,和最后一个值。 -
mad()
: 中位数绝对偏差
-
group_by()
对数据框按照一列或者多列进行分组
group_by()用于对数据集按照给定变量分组,返回分组后的数据集。对返回后的数据集使用以上介绍的函数时,会自动的对分组数据操作。
group_by() 后,数据外观不变。(与 summarize()联用,分组统计描述。)
#使用变量cyl对mtcars分组,返回分组后数据集
by_cyl <- group_by(mtcars, cyl)
#返回每个分组中最大disp所在的行
filter(by_cyl, disp == max(disp))
#返回每个分组中变量名包含d的列,始终返回分组列cyl
select(by_cyl, contains("d"))
#使用mpg对每个分组排序
arrange(by_cyl, mpg)
#对每个分组无重复的取2行记录
sample_n(by_cyl, 2)
#使用变量cyl对mtcars分组,然后对分组后数据集使用聚合函数
by_cyl <- group_by(mtcars, cyl)
#返回每个分组的记录数
summarise(by_cyl, n())
#求每个分组中disp和hp的均值
summarise(by_cyl, mean(disp), mean(hp))
#返回每个分组中唯一的gear的值
summarise(by_cyl, n_distinct(gear))
#返回每个分组第一个和最后一个disp值
summarise(by_cyl, first(disp))
summarise(by_cyl, last(disp))
#返回每个分组中最小的disp值
summarise(by_cyl, min(disp))
summarise(arrange(by_cyl, disp), min(disp))
#返回每个分组中最大的disp值
summarise(by_cyl, max(disp))
summarise(arrange(by_cyl, disp), max(disp))
#返回每个分组中disp第二个值
summarise(by_cyl, nth(disp,2))
#使用cyl对数据框分组
grouped <- group_by(mtcars, cyl)
#获取分组数据集所使用的分组变量
groups(grouped)
#ungroup从数据框中移除组合信息,因此返回的分组变量为NULL
groups(ungroup(grouped))
##计数:
group_size用于返回每个分组的记录数,n_groups返回分成的组数。
对数据集的每个分组计数,类似于base:: table()函数。其中count已经过group_by分组,而tally需要对数据集调用group_by后对分组数据计数。
tally(x, wt, sort = FALSE)
count(x, ..., wt =NULL, sort = FALSE)
#使用count对分组计数,数据已按变量分组
count(mtcars, cyl)
#设置sort=TRUE,对分组计数按降序排序
count(mtcars, cyl, sort = TRUE)
#使用tally对分组计数,需要使用group_by分组
tally(group_by(mtcars, cyl))
#使用summarise对分组计数
summarise(group_by(mtcars, cyl), n())
版权声明:本文为CSDN博主「Kingsley_W」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wltom1985/article/details/54973811
-
sample_n ()
:从给定的数据框中,采样 n 个数据。
sample_n(数据,采样个数,replace=FALSE | TRUE)- replace 表示是否放回抽样,默认为 FALSE,不放回抽样,如果需要放回抽样,则需要设置为 replace=TRUE
-
sample_frac ()
:从给定的数据框中,采样多少比例的数据。
sample_frac(df,0.5,replace=FALSE) 从 df 中,采样 50%的数据。 -
case_when ( )
:针对向量元素,对符合条件的,做操作。
1.当向量中的元素不符合条件时候,会被当做 NA,你操作的向量元素个数,和 case_when 输出的向量元素个数相等。
2.每个条件的执行是有顺序的,顺序从上往下执行!
3.输出的向量的类型必须是统一的,要么为数值型向量,要么为字符型向量,是什么类型取决于最上面执行的条件判断。
4.当进行两个向量间的条件判断的时候,两个向量的元素个数必须相等
格式为:case_when(条件 1~针对条件 1 进行的操作,TRUE~某操作)
其中,符号"~"可理解为赋值操作。TRUE 可理解为 else,注意 else 的范围是最大的,如果放在第一行,并且进行的是赋值操作,那么就会返回你赋的值,如果是针对向量元素的操作,那么返回的还是一个向量。见下图。-
if_else ( )
:对向量进行条件筛选,然后操作。- if_else(条件,满足条件的元素的操作,不满足条件的元素的操作)
-
-
集合操作:
-
union()
:并集去重 -
union_all( )
: 并集不去重 -
intersect
: 交集 -
setdiff()
:差集 - setdiff(a,b)a 中哪些在 b 中没有
-
setequal()
: 判断是否相等
-
-
distinct()
:数据框去重。
默认使用所有变量去重,除非指定变量。
‘ .keep_all ’ :去重后是否保留所有变量。(FALSE,则只保留指定用于去重的变量) -
数据框连接:
inner_join, left_join, right_join, full_join,anti_join,semi_join
等
reference:
R 语言中 dplyr 包 join 函数之目前我看到过的最形象的教程 - 简书 (jianshu.com)
-
内连接 inner_join 函数
- 内连接的结果是一个新数据框,其中包含键、 x 值和 y 值。我们使用 by 参数告诉 dplyr 哪个变量是键:
-
外连接
- 内连接保留同时存在于两个表中的观测, 外连接则保留至少存在于一个表中的观测。外连接有 3 种类型。
• 左连接:保留 x 中的所有观测。
• 右连接:保留 y 中的所有观测
• 全连接:保留 x 和 y 中的所有观测。
-
筛选连接
-
semi_join(x, y)
: 保留 x 表中与 y 表中的观测相匹配的所有观测。 -
anti_join(x, y)
: 丢弃 x 表中与 y 表中的观测相匹配的所有观测。
-
-
数据框合并:
合并的对象为数据框,也可以是能够转换为数据框的列表。
- 按行合并函数
bind_rows()
通过列名进行匹配,不匹配的值使用NA替代,类似于base:: rbind()函数。 - 按列合并函数
bind_cols()
通过行号匹配,因此合并的数据框必须有相同的行数,函数类似于base:: cbind()函数。原数据集行名称会被过滤掉。语法如下:
#按行合并,.id添加新列用于指明合并后每条数据来自的源数据框
bind_rows(...,.id = NULL)
#按列合并
bind_cols(...)
#合并数据集
combine(...)
Reference :
https://blog.csdn.net/wltom1985/article/details/54973811
https://zhuanlan.zhihu.com/p/358167377