使用dplyr包
内容提要
本文介绍R语言dplyr包处理数据框的常用函数:filter()和slice()筛选行,arrange()排序,select()选列,mutate()新增变量,summarise()计算统计量,group_by()分组,并用管道符%>%组合多步操作。以MASS包的birthwt数据集演示,最后用epiDisplay包的Planning数据练习数据清理。
延伸解读
dplyr 函数的一致设计
dplyr 包中所有处理数据框的函数都将数据框名称作为第一个参数,这种统一规范使得函数易于组合。例如 filter()、arrange()、select() 等均遵循此约定,因此可以方便地使用管道符 %>% 将多个操作串联起来,避免创建无意义的中间变量,让代码更简洁易读。
分组与汇总的配合
group_by() 函数本身不会改变数据框的外观,但会改变其与其他 dplyr 动词函数协作的方式。分组后,数据框会附加分组属性,再结合 summarise() 即可轻松计算各组的统计量。例如对 birthwt 数据按 race 分组后,可计算每组的平均出生体重。
函数名冲突与命名空间
当同时加载 dplyr 和 MASS 包时,由于两者都有 select() 函数,R 会默认使用后加载包中的函数,可能导致意外结果。为避免混淆,可以使用 dplyr::select() 明确指定要使用的函数。这是处理包间函数名冲突的通用方法。
数据清理中的条件替换
在数据清理中,常需要将缺失值编码(如 9、99、999)替换为 NA。dplyr 的 mutate() 结合 ifelse() 可以高效完成这一任务。例如在 Planning 数据中,将 relig 为 9 的值替换为 NA,将 ped 为 0 或 9 的值替换为 NA,从而保证后续分析的准确性。
Q&A
dplyr包中filter()和slice()函数有什么区别?
filter()根据条件筛选行,如filter(birthwt, age > 35);slice()按行号选择行,如slice(birthwt, 2:5)。
如何使用arrange()对数据框进行多列排序?
arrange()默认升序,可指定多个变量,如arrange(birthwt, bwt, age)先按bwt升序,bwt相同再按age升序;降序用desc(),如arrange(birthwt, desc(bwt))。
select()函数在dplyr中有什么作用?
select()用于选择数据框中的列,如select(birthwt, bwt, age, race, smoke)选取四个变量组成新数据框。
mutate()函数如何创建新变量?
mutate()用于创建新变量,如mutate(birthwt, lwt.kg = lwt*0.4536)将lwt乘以0.4536生成新变量lwt.kg。
group_by()和summarise()如何结合使用进行分组统计?
先用group_by()按分类变量分组,如group_by(birthwt, race),再用summarise()计算每组统计量,如summarise(birthwt.group, mean(bwt))。
管道符%>%在dplyr中有什么作用?
管道符%>%将前面的对象作为后面函数的第一个参数,从而组合多个操作,避免创建中间变量,如birthwt %>% mutate(...) %>% group_by(race) %>% summarise(mean(bwt))。