您的位置:首页 > 其它

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

2017-03-08 21:29 169 查看
数据清洗和整理:

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

筛选各种变量select()
根据一个或者多个变量进行排序arrange()
变量重命名以及增加新的变量names()或者colnames()&mutate()
根据某个变量进行分类汇总summarize()
简单随机抽样sample()
各种连接inner_join()等
按行或者按列进行合并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 <NA> 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 <NA>  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











                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息