使用R语言的dplyr包进行数据预处理

数据清洗和整理:

总结整理的各种资源,包括使用dplyr包以及R自带的函数等等,主要用于数据预处理

  1. 筛选各种变量select()
  2. 根据一个或者多个变量进行排序arrange()
  3. 变量重命名以及增加新的变量names()或者colnames()&mutate()
  4. 根据某个变量进行分类汇总summarize()
  5. 简单随机抽样sample()
  6. 各种连接inner_join()等
  7. 按行或者按列进行合并rbind()或者cbind()

使用R中的数据

library(nycflights13)
library(dplyr)

1.筛选符合条件的数据

同样的效果,都是从数据集flight_df中筛选出变量

data1<-filter(flights_df, month == 1, day == 1)
flights_df[flights_df$month == 1 & flights_df$day == 1, ]

上面这段代码类似于sql中的select语句
select * 
from flights_dt
where month=1 and day=1

2.筛选某些变量
通过列名来选择
select(flights_df, year, month, day)

通过 :来选择
select(flights_df, year:day)

通过 - 来去掉不需要的变量
select(flights_df, -(year:day))

3.排序

将flights_df数据集按照year,month,day的升序排列

arrange(flights_df, year, month, day)


如果按照单个变量进行排序的话,也可以使用sort()函数

decreasing默认是F,升序排列,如果是T那么就是降序排列

na.list默认是F,去掉缺失值NA,如果是T那么就是不去掉缺失值,缺失值在最后

sort(filghts$year,decreasing=F, na.last= F)

order函数也是排序,但是返回的是元素所在的位置

order(filghts$year,decreasing=F, na.last= F)

flights[order(-flights$month),]



上面这段代码类似于sql中的order by语句

select *
from flights_dt
order by year,month,day desc

4.给列命名

如果数据集为数据框data.frame,那么可以使用fix(flights)就可以打开数据编辑器,在里面直接修改就可以

如果数据集为列表list,使用names()函数或者colnames()函数进行重命名,代码如下:

> names(flights_cs)#首先查看列名
[1] "year"  "month" "day"  
> colnames(flights_cs)<-c("year","day","week")#给列重新命名
> names(flights_cs)#看到列名已经通过colnames函数更改
[1] "year" "day"  "week"
> names(flights_cs)<-c("a","b","c")#使用函数names进行命名
> names(flights_cs)#查看最新的列名
[1] "a" "b" "c"


5.产生新的列

如下代码在数据集flights中产生了gain和speed两列

flights_new<-mutate(flights,  
                    gain=arr_delay - dep_delay,  
                    speed=distance / air_time * 60) 

6.随机抽取样本

在数据集中随机抽取10个样本,不放回

sample(flights,10,replace=TRUE)

在数据集中随机抽取四分之三的数据为训练集,四分之一的数据为测试集
set.seed(1)
sub<-sample(1:nrow(flights),round(nrow(flights)/4))
data_train<-flights[-sub,]#训练集
data_test<-flights[sub,]#测试集


7.分类汇总
进行简单的计算,比如求某一列的均值
summarise(flights,mean(distance))

按某一列进行分组,得到新的数据
by_tailnum <- group_by(flights, tailnum)

分组以后,统计每组的个数,求每组的distance的均值
delay <- summarise(by_tailnum,  
                   count = n(),  
                   dist = mean(distance))  

总结:上面group_by()以及summarize()函数中都有数据集名flights,还有一种通过引入%>%的方法,不在函数中使用数据集名
flights %>%  
    group_by(year, month, day) %>%  
    select(arr_delay, dep_delay) %>%  
    summarise(  
        arr = mean(arr_delay),  
        dep = mean(dep_delay)  
    ) %>%


8.各种连接

inner_join #内连接 
left_join #左连接 
right_join #右连接 
full_join #全连 
semi_join # 返回能够与y表匹配的x表所有记录 
anti_join # 返回无法与y表匹配的x表的所有记录

> options(warn =-1)#这个是忽略警告,默认warn=0是提示警告
> library(dplyr)
> df1 <- data.frame(x = c('a','b','c'), y = c('A','B','C'))
> df2 <- data.frame(x = c('a','b','d'), z = c(1,2,3))
> inner_join(df1,df2) #内连接 
Joining, by = "x"
  x y z
1 a A 1
2 b B 2
> left_join(df1,df2) #左连接 
Joining, by = "x"
  x y  z
1 a A  1
2 b B  2
3 c C NA
> right_join(df1,df2) #右连接 
Joining, by = "x"
  x    y z
1 a    A 1
2 b    B 2
3 d  3
> full_join(df1,df2) #全连 
Joining, by = "x"
  x    y  z
1 a    A  1
2 b    B  2
3 c    C NA
4 d   3
> semi_join(df1,df2) # 返回能够与df2表匹配的df1表所有记录 
Joining, by = "x"
  x y
1 a A
2 b B
> anti_join(df1,df2) # 返回无法与df2表匹配的df1表的所有记录
Joining, by = "x"
  x y
1 c C


9.按行或者按列进行合并

注意:对应变量的数据类型必须相同

按行合并:rbind()#增加行数

按列合并:cbind()以及merge()#增加列数

其中merge只按照共同的变量进行合并,作用类似于inner_join

> sj1 <- data.frame(x = c('a','b','c'), y = c('A','B','C'))
> sj2<- data.frame(x = c('a','b','d'), y = c("H","I","J"))
> rbind(sj1,sj2)
  x y
1 a A
2 b B
3 c C
4 a H
5 b I
6 d J
> cbind(sj1,sj2)
  x y x y
1 a A a H
2 b B b I
3 c C d J
> merge(sj1,sj2,by="x")
  x y.x y.y
1 a   A   H
2 b   B   I











你可能感兴趣的:(数据预处理,r语言,数据预处理,数据清洗,dplyr包)