数据清洗和整理:
总结整理的各种资源,包括使用dplyr包以及R自带的函数等等,主要用于数据预处理
使用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, ]
select *
from flights_dt
where month=1 and day=1
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"
如下代码在数据集flights中产生了gain和speed两列
flights_new<-mutate(flights,
gain=arr_delay - dep_delay,
speed=distance / air_time * 60)
在数据集中随机抽取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,]#测试集
summarise(flights,mean(distance))
by_tailnum <- group_by(flights, tailnum)
delay <- summarise(by_tailnum,
count = n(),
dist = mean(distance))
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